识别嵌套对象数组中具有重复字段的文档的更快方法

问题描述 投票:0回答:1

我正在搜索更快的选项来匹配嵌套数组中字段中具有重复值的文档,匹配条件的示例文档:

{
 "key": 2,
a: [
  {
    p: [
      {
        id: 2
      },
      {
        id: 3
      },
      {
        id: 3
      }
    ]
  }
  ]
 }

我需要找到更快的方法来仅匹配具有重复 a.p.id 值的文档,在带有 key:2 的示例文档中具有重复的 a.p.id:3,这是否可能不使用 $uwind?

游乐场

预期产出:

{ key:2 , id:3 }

或完整的匹配文件

我现在所拥有的是:https://mongoplayground.net/p/Qs7xuYQy-vQ

但我相信总有更好的东西......,我在想也许有 $reduce/$size 操作或 $push/$addToSet 可以接近我正在搜索的答案,但还没有确定......

mongodb aggregation-framework
1个回答
0
投票

一个选项是:

  1. 每个
    key
  2. 将阵列展平并清理成一个阵列
  3. 只匹配有重复的文档
  4. 查找重复值数组
  5. 格式化响应
db.collection.aggregate([
  {$project: {
      cleanArr: {$reduce: {
          input: "$a",
          initialValue: [],
          in: {$concatArrays: ["$$value", "$$this.p.id"]}
      }},
      key: 1,
      _id: 0
  }},
  {$match: {
      $expr: {$gt: [
          {$size: "$cleanArr"},
          {$size: {$setIntersection: ["$cleanArr"]}}
      ]}
  }},
  {$project: {
      key: 1,
      res: {$reduce: {
          input: "$cleanArr",
          initialValue: {arr: [], id: []},
          in: {$cond: [
              {$in: ["$$this", "$$value.arr"]},
              {arr: "$$value.arr", id: {$concatArrays: ["$$value.id", "$$this"]]}},
              {id: "$$value.id", arr: {$concatArrays: ["$$value.arr", ["$$this"]]}}
          ]}
      }}
  }},
  {$project: {key: 1, id: "$res.id"}}
])

游乐场示例中查看它是如何工作的

© www.soinside.com 2019 - 2024. All rights reserved.