Mongo 数据库加入 Primary/Foreign 键

Mongo DB Join on Primary/Foreign Key

我有两个合集,即:clibmpclib 的架构是:{name: String, type: Number}mp 的架构是:{clibId: String}.

clib 的示例文档:

{_id: ObjectId("6178008397be0747443a2a92"), name: "c1", type: 1}
{_id: ObjectId("6178008397be0747443a2a91"), name: "c2", type: 0}

mp 的示例文档:

{clibId: "6178008397be0747443a2a92"}
{clibId:"6178008397be0747443a2a91"}

在查询 mp 时,我想要在 clib 集合中具有 type = 0 的那些 clibId's

知道如何实现吗?

我能想到的一种方法是使用 $lookUp,但这似乎不起作用。另外,我不确定这是否是 mongodb 的反模式,另一种方法是将 typeclib 复制到 mp,同时保存 mp document

如果我没理解错的话,您可以使用这样的管道:

此查询从 clib 获取值,其中 _idclibId 相同,并且还有 type = 0。此外,我还添加了一个 $match 阶段,以便在没有任何巧合的情况下不输出值。

db.mp.aggregate([
  {
    "$lookup": {
      "from": "clib",
      "let": {
        "id": "$clibId"
      },
      "pipeline": [
        {
          "$match": {
            "$expr": {
              "$and": [
                {
                  "$eq": [
                    {
                      "$toObjectId": "$$id"
                    },
                    "$_id"
                  ]
                },
                {
                  "$eq": [
                    "$type",
                    0
                  ]
                }
              ]
            }
          }
        }
      ],
      "as": "result"
    }
  },
  {
    "$match": {
      "result": {
        "$ne": []
      }
    }
  }
])

示例here

db.mp.aggregate([
  {
    $lookup: {
      from: "clib",
      let: {
        clibId: "$clibId"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                {
                  $eq: [ "$_id", "$$clibId" ],
                }
              ]
            }
          }
        },
        {
          $project: { type: 1, _id: 0 }
        }
      ],
      as: "clib"
    }
  },
  {
    "$unwind": "$clib"
  },
  {
    "$match": {
      "clib.type": 0
    }
  }
])

Test Here