【问题标题】:Perform a conditional lookup, and add custom data if from collection has no data执行条件查找,如果集合中没有数据,则添加自定义数据
【发布时间】:2022-02-23 05:36:01
【问题描述】:

我有两个收藏

collection1 : [
 {
  _id:"90b992b7-b85f-4e1c-9080-fc3e2dba0db0",
  pIds: [ "47c9124d-f027-4221-8d60-9f491993d923", "08c89e83-ad62-443c-a731-3c6ccd9ca3af" ]
 }
]

collection2 : [
 {
  _id: "47d44016-ff84-44dc-b650-abab36d5f661",
  userId: "47c9124d-f027-4221-8d60-9f491993d923",
  isOnline: true
 }
]

collection2 有"47c9124d-f027-4221-8d60-9f491993d923" 这个userId 的数据,但是collection2 中没有"08c89e83-ad62-443c-a731-3c6ccd9ca3af" 这个userId 的数据。

现在想要下面的输出

output : [
 {
  _id:"90b992b7-b85f-4e1c-9080-fc3e2dba0db0",
  pIds: [ 
   {
    userId: "47c9124d-f027-4221-8d60-9f491993d923",
    isOnline: true
   },
   {
    userId: "08c89e83-ad62-443c-a731-3c6ccd9ca3af",
    isOnline: false
   },
  ]
 }
]

试过

$lookup: {
 from: "collection2",
 let: { pIds: "$pIds" },
 pipeline: [
  { $match: { $expr: { $in: ["$userId", "$$pIds"] } } },
  { $project: { _id: 0 } },
 ],
 as: "pId",
}

任何解决方案都会有很大帮助....

提前致谢

【问题讨论】:

    标签: mongodb mongodb-query nosql aggregation-framework


    【解决方案1】:
    db.collection1.aggregate([
      {
        "$unwind": "$pIds"
      },
      {
        "$lookup": {
          "from": "collection2",
          "localField": "pIds",
          "foreignField": "userId",
          "as": "docs"
        }
      },
      {
        "$group": {
          "_id": "$_id",
          "pids": {
            "$push": {
              userId: "$pIds",
              isOnline: { "$ifNull": [ { $first: "$docs.isOnline" }, false ] }
            }
          }
        }
      }
    ])
    

    mongoplayground

    【讨论】:

      【解决方案2】:

      这是另一种方法。我想知道接受的答案是否有任何改进。我想这归结为"$unwind""$group""$map""$mergeObjects""$reduce""$filter" 的性能。我不确定如何衡量。

      db.collection1.aggregate([
        {
          "$lookup": {
            "from": "collection2",
            "localField": "pIds",
            "foreignField": "userId",
            "as": "docs"
          }
        },
        {
          "$project": {
            "_id": 1,
            "pIds": {
              "$map": {
                "input": "$pIds",
                "as": "pId",
                "in": {
                  "$mergeObjects": [
                    { "userId": "$$pId" },
                    { "isOnline": {
                        "$reduce": {
                          "input": "$docs",
                          "initialValue": false,
                          "in": {
                            "$or": [
                              false,
                              {
                                "$getField": {
                                  "field": "isOnline",
                                  "input": {
                                    "$first": {
                                      "$filter": {
                                        "input": "$docs",
                                        "as": "doc",
                                        "cond": { "$eq": [ "$$pId", "$$doc.userId" ] }
                                      }
                                    }
                                  }
                                }
                              }
                            ]
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      ])
      

      试试mongoplayground.net

      【讨论】:

        猜你喜欢
        • 2022-11-15
        • 2021-10-15
        • 2014-10-14
        • 2021-08-19
        • 1970-01-01
        • 2011-12-25
        • 2019-11-08
        • 2022-11-10
        • 2021-10-08
        相关资源
        最近更新 更多