【问题标题】:$lookup with two fields with same collection$lookup 具有相同集合的两个字段
【发布时间】:2018-07-20 19:34:45
【问题描述】:

我有以下挑战收藏

{
    "_id" : ObjectId("5b4ef87fdc816e25d5eea3de"),
    "receiver" : ObjectId("5b4c3000c851e3347d077312"),
    "receiverWorkoutId" : ObjectId("5b4ee663a769cb6459180dab"),
    "sender" : ObjectId("5b4c3432bad1c64f82fd4d94"),
}

我有关注用户收藏

{
    "_id" : ObjectId("5b4c3432bad1c64f82fd4d94"),
    "name": "bruce wayne"
}

{
    "_id" : ObjectId("5b4c3000c851e3347d077312"),
    "name": "clerk kent"
}

我需要跟随预期的输出

{
    "_id" : ObjectId("5b4ef87fdc816e25d5eea3de"),
    "sender" : {
      "_id" : ObjectId("5b4c3432bad1c64f82fd4d94"),
      "name": "bruce wayne"
    },
    "receiverWorkoutId" : ObjectId("5b4ee663a769cb6459180dab"),
    "receiver" : {
      "_id" : ObjectId("5b4c3000c851e3347d077312"),
      "name": "clerk kent"
    }
}

我知道我可以用两个$lookup 阶段做这样的事情,但我想用letpipeline 处理单个$lookup 阶段

提前致谢!!!

【问题讨论】:

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


    【解决方案1】:

    您可以在 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}},
    ])
    

    【讨论】:

    • 只有这样才能做到这一点?分别为两者或这个分别查找哪个更好?因为这似乎不是一个好办法……?
    • 不确定这是否是唯一的方法,但我会使用两次查找。当您有多个连接条件时,最好使用较新的查找。您可以为您的用例使用猫鼬填充。
    • $lookup 之后,我认为填充不是连接两个集合的好方法... 当您有多个连接条件时最好使用较新的查找 怎么样?因为从上面我看不到好方法
    猜你喜欢
    • 2019-03-11
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2023-01-12
    • 1970-01-01
    相关资源
    最近更新 更多