$ lookup具有两个具有相同集合的字段

时间:2018-07-20 10:49:03

标签: node.js mongodb mongoose mongodb-query aggregation-framework

我有以下挑战收藏

{
    "_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阶段执行类似的操作,但是我想在$lookuplet的单个pipeline阶段执行

提前谢谢!

1 个答案:

答案 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}},
])