首页 > 解决方案 > 如何在 MongoDB 中使相同的集合内部连接等效?

问题描述

我有看起来像 EAV(或某些键/值)的集合:

{domain_id: 1, key: "A", value: 1}
{domain_id: 1, key: "B", value: 2}
{domain_id: 1, key: "C", value: 3}

{domain_id: 2, key: "A", value: 5}
{domain_id: 2, key: "B", value: 2}
{domain_id: 2, key: "C", value: 3}

{domain_id: 3, key: "C", value: 3}

我需要找到所有domain_id拥有key = "A" AND value = 1和拥有的东西key = "C" AND value = 3(交叉点,而不是 OR 条件)所以假设的结果将是:

{domain_id: 1}

标签: mongodbmongodb-queryaggregation-framework

解决方案


  1. $group- 分组依据domain_id$pushdata字段中记录。
  2. $match-$and用于多重比较,$elemMatch以匹配数组元素中的字段值。
  3. $project- 选择domain_id
db.collection.aggregate([
  {
    $group: {
      _id: "$domain_id",
      data: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $match: {
      $and: [
        {
          "data": {
            $elemMatch: {
              "key": "A",
              "value": 1
            }
          }
        },
        {
          "data": {
            $elemMatch: {
              "key": "C",
              "value": 3
            }
          }
        }
      ]
    }
  },
  {
    $project: {
      domain_id: "$_id"
    }
  }
])

示例 Mongo Playground


推荐阅读