首页 > 解决方案 > 在 mongo DB 中查找比较集合数据与数组的聚合结果

问题描述

我想在聚合结果中将集合与数组进行比较

我有以下两个集合。

  1. 聊天合集

chat.tags 是引用键中的数组值,来自标签集合。

"chat": [
    {
      "id": "test1",
      "tags": [
        "AAA",
        "BBB",
        "CCC",
        "AAA"
      ]
    },
    {
      "id": "test2",
      "tags": [
        "AAA",
        "BBB",
        "CCC"
      ]
    }
  ]
  1. 标签集合
  "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”和聊天集合中的唯一标签。

我想使用 mongo 聚合来跟踪结果。使用查找时是否可以使用 from、let、管道?

[
  {
    "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"
     }
    ]
  }
]




请帮我。

标签: arraysmongodbaggregation-frameworklookup

解决方案


这可以通过一个简单的 来实现$lookup,如下所示:

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

蒙戈游乐场

  • 我不完全理解您想要的输出结构是什么,但可以通过不同的$project阶段轻松更改它。

- - 编辑 - -

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

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

蒙戈游乐场


推荐阅读