我正在尝试正确编写一个查询,该查询将连接两个集合中的对象。在一个集合(A)中,例如,我具有带有字段和用户数组的对象,每个用户对象都有一个userDetailsId,当将每个用户与每个他的userDetails合并/合并时,我将使用该userDetailsId集合B。
集合A:
{
"_id": "1",
"field1": "value1",
"field2": "value2",
"users": [
{
"userField1": "value3",
"userField2": "value4",
"userDetailsId": "100"
},{
"userField1": "value5",
"userField2": "value6",
"userDetailsId": "200"
}
]
}
集合B:
{
"_id": "100",
"field1": "value1",
"field2": "value2",
"object1": {
"field3": "value3",
"field4": "value4"
},
"object2": {
"field5": "value5",
"field6": "value6"
}
},
{
"_id": "200",
"field1": "value1",
"field2": "value2",
"object1": {
"field3": "value3",
"field4": "value4"
},
"object2": {
"field5": "value5",
"field6": "value6"
}
}
首选结果:
{
"_id": "1",
"field1": "value1",
"field2": "value2",
"users": [
{
"userField1": "value3",
"userField2": "value4",
"userDetailsId": "100",
"userDetails":{
"_id": "100",
"field1": "value1",
"field2": "value2",
"object1": {
"field3": "value3",
"field4": "value4"
},
"object2": {
"field5": "value5",
"field6": "value6"
}
}
},{
"userField1": "value5",
"userField2": "value6",
"userDetailsId": "200",
"userDetails":{
"_id": "200",
"field1": "value1",
"field2": "value2",
"object1": {
"field3": "value3",
"field4": "value4"
},
"object2": {
"field5": "value5",
"field6": "value6"
}
}
}
]
}
我写了一个查询,但没有得到首选结果:
db.collectiona.aggregate([{$match: {'_id':1}},{$lookup:{from:"collectionb", localField: "users.userdetailsid", foreignField: "_id", as:"userdetails"}}
如果运行此命令,我将只合并这两个集合,并将集合B中所有匹配的userdetails对象包含在结果内部作为userdetails数组。
由于我的目标是将用户及其用户详细信息合并到用户对象中,因此我尝试将设置为:“ users.userdetails” ,但这将用用户详细信息数据替换用户(未找到匹配userdetailsid时,将upsert设置为true并在用户中添加整个userdetails对象的可能方法。
之后,我尝试通过管道传递聚合结果,并尝试将userdetails与查询一起放入用户对象
db.collectiona.aggregate([{$match: {'_id':1}},{$lookup:{from:"collectionb", localField: "users.userdetailsid", foreignField: "_id", as:"userdetails"},
{"$addFields":{
"user.userdetails":{
"$map":{
"input": "$shifts",
"in":{
"$mergeObjects":["$$this",{"$arrayElemAt":["$collectionb",{"$indexOfArray":["$collectionb.id","$$this.userdetailsid"]}]}]
}
}
}
}}
}
但这也不好。
您有任何想法如何正确编写查询以得到这种结果?
答案 0 :(得分:1)
您需要首先$unwind
users
数组以与正确的userDetailsId
匹配,然后$group
与$push
来将用户再次回滚到数组中< / p>
db.collectiona.aggregate([
{ "$match": { "_id": 1 }},
{ "$unwind": "$users" },
{ "$lookup": {
"from": "collectionb",
"localField": "users.userDetailsId",
"foreignField": "_id",
"as": "users.userDetails"
}},
{ "$unwind": "$users.userDetails" },
{ "$group": {
"_id": "$_id",
"field1": { "$first": "field1" }
"field2": { "$first": "field2" }
"users": { "$push": "users" }
}}
])