从mongodb中删除重复的数组值

3
在mongodb中,我有一个包含重复条目的数组集合,例如:
{
    "_id": ObjectId("57cf3cdd5f20a3b0ba009777"),
    "Chat": 6,
    "string": [
        "1348157031 Riyadh",
        " 548275320 Mohammad Sumon",
        " 1348157031 Riyadh",
        " 548275320 Mohammad Sumon",
        " 1348157031 Riyadh",
        " 1348157031 Riyadh"
    ]
}

我需要删除重复的数组,并仅保留像下面一样的唯一数组值。
{
    "_id": ObjectId("57cf3cdd5f20a3b0ba009777"),
    "Chat": 6,
    "string": [
        "1348157031 Riyadh",
        " 548275320 Mohammad Sumon",
    ]
}

如何最好地完成这个任务?

谢谢!


您是要修改现有文档还是仅适用于新文档? - Nitin Verma
1
可能是重复的问题:如何从数组中删除重复项? - dyouberg
是的,我确实想修改现有文档。 - Sumon
我明白这有点重复,但如果有人能帮忙,我将非常感激。 - Sumon
你可能需要像这样在客户端执行(在重复链接中列出)https://dev59.com/VF7Va4cB1Zd3GeqPFwMU - dyouberg
上面的链接尝试删除记录,但我只需要删除重复列表。 - Sumon
2个回答

2
db.getCollection('Test').aggregate([{
    $unwind: '$string'},
    {
        $group: {
            _id: '$_id', 
            string: {
                $addToSet: '$string'
            }, 
            Chat: {
                $first: '$Chat'
            }
        }
    }
    ]);

输出结果:

这里出现了2个“1348157031 Riyadh”,因为有一个额外的空格,它定义为不同的实体。

{
    "_id" : ObjectId("57cf3cdd5f20a3b0ba009777"),
    "string" : [ 
        " 1348157031 Riyadh", 
        " 548275320 Mohammad Sumon", 
        "1348157031 Riyadh"
    ],
    "Chat" : 6
}

谢谢Shantanu,我可以使用任何代码来从这个数组的第一个元素中去掉空格吗? - Sumon
如果这是误操作,我建议您直接在数据库中进行修改,并且从下一次开始始终在客户端修剪并保存。 - Shantanu Madane
@ Shantany 我能够聚合,但如何从数据库中永久删除重复元素? - Sumon
请点击以下链接以获取帮助:https://dev59.com/zGMk5IYBdhLWcg3w-Ciq - Shantanu Madane

0
Mongo 3.4+有$addFields聚合阶段,它允许您避免明确列出要保留的所有其他字段:
collection.aggregate([
    {"$addFields": {
        "string": {"$setUnion": ["$string", []]}
    }}
])

仅供参考,这里还有一种更长的方法,使用$replaceRoot,并且不需要列出所有可能的字段:

collection.aggregate([
    {'$unwind': {
        'path': '$string',
        // output the document even if its list of books is empty
        'preserveNullAndEmptyArrays': true
    }},
    {'$group': {
        '_id': '$_id',
        'string': {'$addToSet': '$string'},
        // arbitrary name that doesn't exist on any document
        '_other_fields': {'$first': '$$ROOT'},
    }},
    {
      // the field, in the resulting document, has the value from the last document merged for the field. (c) docs
      // so the new deduped array value will be used
      '$replaceRoot': {'newRoot': {'$mergeObjects': ['$_other_fields', "$$ROOT"]}}
    },
    {'$project': {'_other_fields': 0}}
])    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接