【问题标题】:How to make array elements unique in mongodb如何使数组元素在mongodb中唯一
【发布时间】:2022-01-06 13:21:44
【问题描述】:

在我的 mongo 集合中,我有一个数组,其中所有元素都必须是唯一的。 但是错误地,我添加了重复的元素。如何使数组元素不同? 有查询/命令吗?

集合中的文档:

{
   Tags: ["a", "a", "a"]
}

但我想要:

{
  Tags: ["a"]
}

【问题讨论】:

    标签: mongodb nosql


    【解决方案1】:

    对于 mongo 4.2+ 版本,您可以将pipelined updates$setUnion 结合使用,如下所示:

    db.collection.updateMany({},
    [
      {
        $set: {
          Tags: {
            $setUnion: "$Tags"
          }
        }
      }
    ])
    

    Mongo Playground

    【讨论】:

    • 只是一个注释:如果集合很大并且标签数组中只有少数文档具有重复元素需要更新,因为它会强制更新所有集合文档,所以这个解决方案不太适合。 ..
    • 这是真的,没有办法只更新包含重复文件的文档。
    【解决方案2】:

    您可以在相关collectiontag 属性上创建唯一索引。

    请参考以下官方指南;

    https://docs.mongodb.com/manual/core/index-unique/

    【讨论】:

    • 如何删除之前添加的重复元素?我只想保留每个元素一次。
    • 在向数组中添加新元素时,必须使用 $addToSet 而不是 $push,以保持数组中的唯一值...
    【解决方案3】:

    这看起来是从 mongo shell 中清除重复项的好选择:

     db.collection.aggregate([
        { "$project": {
            "Tags": { "$setUnion": [ "$Tags", [] ] },
            "same": { "$eq": [
            { "$size": "$Tags" },
            { "$size": { "$setUnion": [ "$Tags", [] ] } }
        ]}
      }},
       { "$match": { "same": false } }
     ]).forEach(function(doc) {
     db.collection.update(
        { "_id": doc._id },
        { "$set": { "Tags": doc.Tags } }
      )
     })
    

    解释:

    1. 投影一个只有唯一值的新字段“标签”。
    2. 投影一个“相同”的新字段,它将检查并说明是否有重复。
    3. 仅匹配有重复的文档
    4. 使用 forEach 循环遍历具有重复标签的文档以替换为唯一版本。

    【讨论】:

      猜你喜欢
      • 2016-09-11
      • 2020-02-02
      • 1970-01-01
      • 2019-06-26
      • 2011-10-08
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多