查找比较 collection 数据与数组在 mongo 数据库中的聚合结果

lookup compare collection data with array in aggregate result in mongo DB

我想比较 collection 与数组的聚合结果

我有以下两个collection。

  1. 聊天collection

chat.tags 是参考键中的数组值来自标签 collection.

"chat": [
    {
      "id": "test1",
      "tags": [
        "AAA",
        "BBB",
        "CCC",
        "AAA"
      ]
    },
    {
      "id": "test2",
      "tags": [
        "AAA",
        "BBB",
        "CCC"
      ]
    }
  ]
  1. 标签collection
  "tag": [
    {
      "id": "1234",
      "key": "AAA",
      "name": "a"
    },
    {
      "id": "1235",
      "key": "BBB",
      "name": "b"
    },
    {
      "id": "1236",
      "key": "CCC",
      "name": "c"
    },
    {
      "id": "1237",
      "key": "DDD",
      "name": "d"
    },
  ]

我想得到 id 是“test1”和聊天中唯一标签的结果 collection。

我想使用 mongo 聚合来跟踪结果。 使用查找时可以使用 from, let, pipeline 吗?

[
  {
    "chat": [
      {
        "id": "test1",
        "setTags": [
          "AAA",
          "BBB",
          "CCC"
        ]
      }
    ],
    "tag": [
    {
       "id": "1234",
       "key": "AAA",
       "name": "a"
     },
     {
       "id": "1235",
       "key": "BBB",
       "name": "b"
     },
     {
       "id": "1236",
       "key": "CCC",
       "name": "c"
     }
    ]
  }
]




请帮助我。

这可以通过简单的 $lookup 实现,像这样:

db.chat.aggregate([
  {
    $match: {
      id: "test1"
    }
  },
  {
    $lookup: {
      from: "tag",
      localField: "tags",
      foreignField: "key",
      as: "tagDocs"
    }
  },
  {
    $project: {
      chat: [
        {
          id: "$id",
          setTags: "$tags"
        }
      ],
      tag: "$tagDocs"
    }
  }
])

Mongo Playground

  • 我不完全理解你想要的输出结构是什么,但它可以很容易地通过不同的 $project 阶段进行更改。

--- 编辑 ---

使用 Mongo 的 v3.6 $lookup 语法,管道保持不变,只是 $lookup 阶段发生变化:

{
    $lookup: {
      from: "tag",
      let: {
        tagKeys: "$tags"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$key",
                "$$tagKeys"
              ]
            }
          }
        }
      ],
      as: "tagDocs"
    }
  },

Mongo Playground