我有2个收藏品。
第一个集合:'firmaListesi'
{
"_id" : ObjectId("58455d2d506c1cab1c82153c"),
"value" : {
"firmaid0" : ObjectId("58455d92506c1cab1c82153e"),
"firmaid1" : ObjectId("5847afe2506c912e6e3a72a7"),
"firmaid2" : ObjectId("5850f2e725108a44a813f93f"),
"firmaid3" : ObjectId("58523f272510fae3c1345547")
}
}
{
"_id" : ObjectId("58455d2d506c1cab1c82154c"),
"value" : {
"firmaid0" : ObjectId("5850f2e725108a44a813f93f"),
"firmaid1" : ObjectId("58523f272510fae3c1345547")
}
}
第二个系列:'calisanSayisi'
{
"_id" : ObjectId("58455d92506c1cab1c82153e"),
"value" : 13.0
}
{
"_id" : ObjectId("5850f2e725108a44a813f93f"),
"value" : 1.0
}
{
"_id" : ObjectId("58523f272510fae3c1345547"),
"value" : 3.0
}
我希望与'calisanSayisi._id'和'firmaListesi.value.firmaid'建立联系。我希望以这种方式组合两个集合。我写的代码中有错误。但对于1个区域,这是有效的。你可以在图片中看到我想要的更好。我想为所有领域拍照。
我的结果
{
"_id" : ObjectId("58455d2d506c1cab1c82153c"),
"value" : {
"firmaid0" : ObjectId("58455d92506c1cab1c82153e"),
"firmaid1" : ObjectId("5847afe2506c912e6e3a72a7"),
"firmaid2" : ObjectId("5850f2e725108a44a813f93f"),
"firmaid3" : {
"_id" : ObjectId("58523f272510fae3c1345547"),
"value" : 3.0
}
}
}
{
"_id" : ObjectId("58455d2d506c1cab1c82154c"),
"value" : {
"firmaid0" : ObjectId("5850f2e725108a44a813f93f"),
"firmaid1" : ObjectId("58523f272510fae3c1345547")
}
}
我的代码:
function birlestir(a,b) {
db.firmaListesi.aggregate([
{$lookup: {
from: "calisanSayisi",
localField: a,
foreignField: "_id",
as: a
}},
{$unwind: {path: b, preserveNullAndEmptyArrays: true}},
{$out: "firmalarId"}
]);
}
for(var i=0; i < (Object.keys(db.firmalistesi.value).length); i++){
var a = 'value.firmaid'+i;
var b = '$'+a;
birlestir(a,b);
}
代码中存在重大缺陷。但我找不到解决方案。你能帮忙吗?
修改
'firmaListesi'数组
{
"_id" : ObjectId("58455d2d506c1cab1c82153c"),
"value" : [
ObjectId("58455d92506c1cab1c82153e"),
ObjectId("5847afe2506c912e6e3a72a7"),
ObjectId("5850f2e725108a44a813f93f"),
ObjectId("58523f272510fae3c1345547")
]
}
{
"_id" : ObjectId("58455d2d506c1cab1c82154c"),
"value" : [
ObjectId("5850f2e725108a44a813f93f"),
ObjectId("58523f272510fae3c1345547")
]
}
答案 0 :(得分:1)
您可以使用以下聚合管道。以下查询$unwind
(3.4版本不需要此步骤)来自ObjectID's
集合value
字段的firmaListesi
后跟$look
这些calisanSayisi
数组中b
集合中的ObjectId。
下一步是$unwind
b
输出数组,然后$group
firmaListesi
_id
以推送以前的输出值。最后一步是写入firmalarId
集合。
db.firmaListesi.aggregate([
{$unwind:"$value"},
{$lookup: {
from: "calisanSayisi",
localField: "value",
foreignField: "_id",
as: "b"
}},
{$unwind: {path: "$b", preserveNullAndEmptyArrays: true}},
{$group: {_id:"$_id", value:{$push:"$b"}}},
{$out: "firmalarId"}
])