Trên thực tế, câu trả lời khác là sai. Có thể thực hiện tra cứu trên trường DBREF trong bộ tổng hợp của bạn và bạn không cần MapReduce cho điều đó.
Dung dịch
db.A.aggregate[[
{
$project: {
B_fk: {
$map: {
input: {
$map: {
input:"$bid",
in: {
$arrayElemAt: [{$objectToArray: "$$this"}, 1]
},
}
},
in: "$$this.v"}},
}
},
{
$lookup: {
from:"B",
localField:"B_fk",
foreignField:"_id",
as:"B"
}
}
]]
kết quả
{
"_id" : ObjectId["59bb79df1e9c00162566f581"],
"B_fk" : null,
"B" : [ ]
},
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"B_fk" : [
ObjectId["582abcd85d2dfa67f44127e0"],
ObjectId["582abcd85d2dfa67f44127e1"]
],
"B" : [
{
"_id" : ObjectId["582abcd85d2dfa67f44127e0"],
"status" : NumberInt["1"],
"seq" : NumberInt["0"]
}
]
}
Giải thích ngắn
Vòng lặp qua DBREF với $ MAP, chia mỗi DBREF thành một mảng, chỉ giữ trường $ id, sau đó loại bỏ định dạng K: V với $$ này. Bây giờ bạn có thể tra cứu trên ObjectID.
Giải thích từng bước
Trong bộ tổng hợp, loại DBREF BSON có thể được xử lý giống như một đối tượng, với hai hoặc ba trường [Ref, ID và DB].
Nếu bạn làm:
db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
Đây là kết quả:
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"First_DBref_as_array : [
{
"k" : "$ref",
"v" : "B"
},
{
"k" : "$id",
"v" : ObjectId["582abcd85d2dfa67f44127e0"]
}
],
"Second_DBref_as_array" : [
{
"k" : "$ref",
"v" : "B"
},
{
"k" : "$id",
"v" : ObjectId["582abcd85d2dfa67f44127e0"]
}
]
}
Khi bạn đã biến DBREF thành một mảng, bạn có thể thoát khỏi các trường vô dụng bằng cách truy vấn giá trị tại INDEX 1, như thế này:
db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
Second_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
}
},
]]
result:
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"First_DBref_as_array" : {
"k" : "$id",
"v" : ObjectId["582abcd85d2dfa67f44127e0"]
},
"Second_DBref_as_array" : {
"k" : "$id",
"v" : ObjectId["582abcd85d2dfa67f44127e0"]
}
}
Sau đó, cuối cùng bạn cũng có thể nhận được giá trị bạn muốn bằng cách chỉ vào "$ myValue.v", giống như thế này
db.A.aggregate[[
{
$project: {
first_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
second_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
}
},
{
$project: {
first_DBref_as_ObjectId: "$first_DBref_as_array.v",
second_DBref_as_ObjectId: "$second_DBref_as_array.v"
}
}
]]
result:
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"first_DBref_as_ObjectId" : ObjectId["582abcd85d2dfa67f44127e0"],
"second_DBref_as_ObjectId" : ObjectId["582abcd85d2dfa67f44127e0"]
}
Rõ ràng, trong một đường ống thông thường, bạn không cần tất cả các bước dư thừa này, sử dụng bản đồ $ lồng nhau, bạn có thể nhận được kết quả tương tự trong một lần đi:
db.A.aggregate[[
{
$project: {
B_fk: { $map : {input: { $map: { input:"$bid",
in: { $arrayElemAt: [{$objectToArray: "$$this"}, 1 ]}, } },
in: "$$this.v"}},
}
},
]]
result:
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"B_fk" : [
ObjectId["582abcd85d2dfa67f44127e0"],
ObjectId["582abcd85d2dfa67f44127e1"]
]
}
Tôi hy vọng lời giải thích đủ rõ ràng, nếu không cảm thấy thoải mái khi hỏi.
Báo cáo vấn đề:
Mặc dù sử dụng đường ống tổng hợp trên bộ sưu tập có DBREF cho bộ sưu tập khác, nhưng việc sử dụng $ Lookup không giải quyết được giá trị do trường
db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
2 trong tài liệu tham khảo.Hãy tưởng tượng chúng ta có một bộ sưu tập gọi là
db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
3 với cấu trúc sau.{
"_id" : ObjectId["59bb79df1e9c00162566f581"],
"B_fk" : null,
"B" : [ ]
},
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"B_fk" : [
ObjectId["582abcd85d2dfa67f44127e0"],
ObjectId["582abcd85d2dfa67f44127e1"]
],
"B" : [
{
"_id" : ObjectId["582abcd85d2dfa67f44127e0"],
"status" : NumberInt["1"],
"seq" : NumberInt["0"]
}
]
}
0DBREF trong ví dụ này chỉ ra một tài liệu trong bộ sưu tập người dùng có
db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
4 trong trường db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
5 của nó.Để giải quyết, trường ____ 26 chúng ta cần sử dụng giai đoạn
db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
7, có cú pháp như được đưa ra dưới đây nhưng sẽ không hoạt động, do sự hiện diện của db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
8 trong tên trường.{
"_id" : ObjectId["59bb79df1e9c00162566f581"],
"B_fk" : null,
"B" : [ ]
},
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"B_fk" : [
ObjectId["582abcd85d2dfa67f44127e0"],
ObjectId["582abcd85d2dfa67f44127e1"]
],
"B" : [
{
"_id" : ObjectId["582abcd85d2dfa67f44127e0"],
"status" : NumberInt["1"],
"seq" : NumberInt["0"]
}
]
}
1Dung dịch:
Một trong những cách giải quyết tôi tìm thấy để giải quyết
db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
9 với toán tử db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
7, là với sử dụng toán tử {
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"First_DBref_as_array : [
{
"k" : "$ref",
"v" : "B"
},
{
"k" : "$id",
"v" : ObjectId["582abcd85d2dfa67f44127e0"]
}
],
"Second_DBref_as_array" : [
{
"k" : "$ref",
"v" : "B"
},
{
"k" : "$id",
"v" : ObjectId["582abcd85d2dfa67f44127e0"]
}
]
}
1, {
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"First_DBref_as_array : [
{
"k" : "$ref",
"v" : "B"
},
{
"k" : "$id",
"v" : ObjectId["582abcd85d2dfa67f44127e0"]
}
],
"Second_DBref_as_array" : [
{
"k" : "$ref",
"v" : "B"
},
{
"k" : "$id",
"v" : ObjectId["582abcd85d2dfa67f44127e0"]
}
]
}
2 và {
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"First_DBref_as_array : [
{
"k" : "$ref",
"v" : "B"
},
{
"k" : "$id",
"v" : ObjectId["582abcd85d2dfa67f44127e0"]
}
],
"Second_DBref_as_array" : [
{
"k" : "$ref",
"v" : "B"
},
{
"k" : "$id",
"v" : ObjectId["582abcd85d2dfa67f44127e0"]
}
]
}
3.Ý tưởng đằng sau điều này là bằng cách nào đó, trích xuất giá trị
db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
2 trong trường db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
6 và sau đó sử dụng toán tử db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
7 để có được kết quả mong muốn.{
"_id" : ObjectId["59bb79df1e9c00162566f581"],
"B_fk" : null,
"B" : [ ]
},
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"B_fk" : [
ObjectId["582abcd85d2dfa67f44127e0"],
ObjectId["582abcd85d2dfa67f44127e1"]
],
"B" : [
{
"_id" : ObjectId["582abcd85d2dfa67f44127e0"],
"status" : NumberInt["1"],
"seq" : NumberInt["0"]
}
]
}
2sẽ trả về kết quả:
{
"_id" : ObjectId["59bb79df1e9c00162566f581"],
"B_fk" : null,
"B" : [ ]
},
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"B_fk" : [
ObjectId["582abcd85d2dfa67f44127e0"],
ObjectId["582abcd85d2dfa67f44127e1"]
],
"B" : [
{
"_id" : ObjectId["582abcd85d2dfa67f44127e0"],
"status" : NumberInt["1"],
"seq" : NumberInt["0"]
}
]
}
3Giải trình:
Giai đoạn 1:
{
"_id" : ObjectId["59bb79df1e9c00162566f581"],
"B_fk" : null,
"B" : [ ]
},
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"B_fk" : [
ObjectId["582abcd85d2dfa67f44127e0"],
ObjectId["582abcd85d2dfa67f44127e1"]
],
"B" : [
{
"_id" : ObjectId["582abcd85d2dfa67f44127e0"],
"status" : NumberInt["1"],
"seq" : NumberInt["0"]
}
]
}
4Chuyển đổi đối tượng tác giả từ tham chiếu DBREF thành mảng của các cặp giá trị khóa và trích xuất cặp giá trị khóa của
db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
2 trong trường db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
6{
"_id" : ObjectId["59bb79df1e9c00162566f581"],
"B_fk" : null,
"B" : [ ]
},
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"B_fk" : [
ObjectId["582abcd85d2dfa67f44127e0"],
ObjectId["582abcd85d2dfa67f44127e1"]
],
"B" : [
{
"_id" : ObjectId["582abcd85d2dfa67f44127e0"],
"status" : NumberInt["1"],
"seq" : NumberInt["0"]
}
]
}
5Giai đoạn 2:
{
"_id" : ObjectId["59bb79df1e9c00162566f581"],
"B_fk" : null,
"B" : [ ]
},
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"B_fk" : [
ObjectId["582abcd85d2dfa67f44127e0"],
ObjectId["582abcd85d2dfa67f44127e1"]
],
"B" : [
{
"_id" : ObjectId["582abcd85d2dfa67f44127e0"],
"status" : NumberInt["1"],
"seq" : NumberInt["0"]
}
]
}
6Bản đồ giá trị của khóa
db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
2 cho trường db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
6.{
"_id" : ObjectId["59bb79df1e9c00162566f581"],
"B_fk" : null,
"B" : [ ]
},
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"B_fk" : [
ObjectId["582abcd85d2dfa67f44127e0"],
ObjectId["582abcd85d2dfa67f44127e1"]
],
"B" : [
{
"_id" : ObjectId["582abcd85d2dfa67f44127e0"],
"status" : NumberInt["1"],
"seq" : NumberInt["0"]
}
]
}
7Giai đoạn 3:
{
"_id" : ObjectId["59bb79df1e9c00162566f581"],
"B_fk" : null,
"B" : [ ]
},
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"B_fk" : [
ObjectId["582abcd85d2dfa67f44127e0"],
ObjectId["582abcd85d2dfa67f44127e1"]
],
"B" : [
{
"_id" : ObjectId["582abcd85d2dfa67f44127e0"],
"status" : NumberInt["1"],
"seq" : NumberInt["0"]
}
]
}
8Sử dụng toán tử
db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
7 để tìm nạp trường cục bộ db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
6 từ bộ sưu tập db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
Second_DBref_as_array: {$arrayElemAt: [{$objectToArray:{$arrayElemAt:["$bid",0]}},1]},
}
},
]]
3{
"_id" : ObjectId["59bb79df1e9c00162566f581"],
"B_fk" : null,
"B" : [ ]
},
{
"_id" : ObjectId["582abcd85d2dfa67f44127e1"],
"B_fk" : [
ObjectId["582abcd85d2dfa67f44127e0"],
ObjectId["582abcd85d2dfa67f44127e1"]
],
"B" : [
{
"_id" : ObjectId["582abcd85d2dfa67f44127e0"],
"status" : NumberInt["1"],
"seq" : NumberInt["0"]
}
]
}
9Giai đoạn 4:
db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
0Bản đồ
db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
6 Trường loại mảng đến trường đối tượng.db.A.aggregate[[
{
$project: {
First_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",0]}},
Second_DBref_as_array: {$objectToArray:{$arrayElemAt:["$bid",1]}},
}
},
]]
1Ghi chú:
Theo tài liệu tài liệu tài liệu tài liệu của Mongo DB - Hướng dẫn sử dụng MongoDB
Trừ khi bạn có một lý do thuyết phục để sử dụng DBREF, hãy sử dụng các tài liệu tham khảo thủ công thay thế.