首页 > 解决方案 > Mongo DB加入主/外键

问题描述

我有两个集合,即:clibmp. 的架构clib是 :{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时,我想要那些clibId's收藏。type = 0clib

有什么想法可以实现吗?

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

标签: mongodbmongoosejoinleft-join

解决方案


如果我理解正确,您可以使用这样的管道:

此查询clib从其_id与 相同clibId且也具有的位置获取值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": []
      }
    }
  }
])

这里的例子


推荐阅读