我有以下挑战收藏
{
"_id" : ObjectId("5b4ef87fdc816e25d5eea3de"),
"receiver" : ObjectId("5b4c3000c851e3347d077312"),
"receiverWorkoutId" : ObjectId("5b4ee663a769cb6459180dab"),
"sender" : ObjectId("5b4c3432bad1c64f82fd4d94"),
}
我有以下用户收藏
{
"_id" : ObjectId("5b4c3432bad1c64f82fd4d94"),
"name": "bruce wayne"
}
{
"_id" : ObjectId("5b4c3000c851e3347d077312"),
"name": "clerk kent"
}
我需要跟踪Expexcted输出
{
"_id" : ObjectId("5b4ef87fdc816e25d5eea3de"),
"sender" : {
"_id" : ObjectId("5b4c3432bad1c64f82fd4d94"),
"name": "bruce wayne"
},
"receiverWorkoutId" : ObjectId("5b4ee663a769cb6459180dab"),
"receiver" : {
"_id" : ObjectId("5b4c3000c851e3347d077312"),
"name": "clerk kent"
}
}
我知道我可以在两个$lookup
阶段执行类似的操作,但是我想在$lookup
和let
的单个pipeline
阶段执行
提前谢谢!
答案 0 :(得分:0)
您可以在3.6中使用以下聚合查询。
使用$in
运算符来匹配用户集合中的发送者和接收者值,然后使用$indexOfArray
进行排序,以首先与发送者和接收者进行匹配。
$addFields
用$arrayElemAt
用参考值替换发送者和接收者集合。
$project
,但不包括删除用户收集字段。
db.challenge.aggregate([
{"$lookup":{
"from":"user",
"let":{"sender":"$sender", "receiver":"$receiver"},
"pipeline":[
{"$match":{"$expr":{"$in":["$_id",["$$sender", "$$receiver"]]}}},
{"$addFields":{ "sortorder":{"$indexOfArray":[["$$sender", "$$receiver"], "$_id"]}}},
{"$sort":{"sortorder":1}}
]
"as":"senderandreceiver"
}},
{"$addFields":{"sender":{"$arrayElemAt":["$senderandreceiver",0]}, "receiver":{"$arrayElemAt":["$senderandreceiver",1]}}},
{"$project":{"senderandreceiver":0}},
])