首页 > 解决方案 > 在数组字段中查找具有重复值的 mongo 记录

问题描述

考虑这个 mongo 集合:

[{
        "_id": {
            "s": "HU",
            "k": 1
        },
        "boxed": {
            "values": [{
                    "s": "NL",
                    "k": 2
                },
                {
                    "s": "BR",
                    "k": 3
                },
                {
                    "s": "NL",
                    "k": 2
                }
            ]
        }
    },
    {
        "_id": {
            "s": "FR",
            "k": 2
        },
        "boxed": {
            "values": [{
                "s": "SE",
                "k": 99
            }]
        }
    },
    {
        "_id": {
            "s": "UA",
            "k": 14
        },
        "boxed": {}
    }
]

我基本上是在尝试找到重复的记录boxed.values。一个这样的例子是第一个例子,NL*2它重复了两次。

我的第一个想法是投影数组的原始大小values,用于$map将该对象数组转换为字符串数组(例如$map: { input: "$boxed.values", in: { $concat: ["$$this.s", "*", "$$this.k"] } }),然后从字符串数组中删除重复项,这样我就可以将原始大小与删除一个。如果大小不同,则意味着该记录有重复。

但是,似乎在 mongo(或者至少我还没有找到)中没有办法轻松地从字符串数组中删除重复的值。

有任何想法吗?

标签: arraysmongodbmongodb-query

解决方案


你可以做这样的事情,

[
  {
    $unwind: "$boxed.values"
  },
  {
    $group: {
      _id: "$_id",
      "values": {
        $addToSet: "$boxed.values"
      }
    }
  },
  {
    $addFields: {
      "boxed.values": "$values"
    }
  }
]

工作Mongo 游乐场$addToSet是一个删除重复项的数组操作


推荐阅读