通过使用MongoDB查询组合字段来删除列表中的重复条目



我对MongoDB查询还很陌生,如果可能的话,我很难知道如何解决这个问题。

这个集合中的DB对象由不同的字段和对象列表组成。在这些对象中有规则的字符串字段。

我现在意识到,现在必须删除重复项(我的代码中有错误的逻辑(。但我无法搜索和删除大约10’000个数据库条目,所以我想一定有一个查询。

例如:在本例中,对象一和对象二是重复的,因为string_1和string_2在两个对象中都是相同的。因此,必须删除前两个对象中的一个

{
"string" : "",
"string" : "",
"string" : "",
"list of objects" : [
{
"string_1" : "2",
"string_2" : "2",
"string_3" : "1",
},
{
"string_1" : "2",
"string_2" : "2",
"string_3" : "4",
},
{
"string_1" : "3",
"string_2" : "5",
"string_3" : "3",
},
]
}

期望的结果是:(它保持第一个不重复(其中string_1和string_2在对象之间相等(

{
"string" : "",
"string" : "",
"string" : "",

"list of objects" : [
{
"string_1" : "2",
"string_2" : "2",
"string_3" : "1",
},
{
"string_1" : "3",
"string_2" : "5",
"string_3" : "3",
},
]
}

感谢提供的任何帮助

一个选项是使用$unwind$group创建具有唯一属性的项目:

当前解决方案将合并string_1string_2与其他项相同(彼此不相同(的项,因为这些属性正在创建组_id(不检查string_3的唯一性(。您也可以在string_3上使用相同的逻辑,如果需要,只需将其插入第一组_id:

db.collection.aggregate([
{
$unwind: {
path: "$list of objects",
includeArrayIndex: "index"
}
},
{
$group: {
_id: {
string_1: "$list of objects.string_1",
string_2: "$list of objects.string_2"
},
string_3: {$first: "$list of objects.string_3"},
string: {$first: "$string"},
index: {$first: "$index"},
origId: {$first: "$_id"}
}
},
{$sort: {index: 1}},
{$group: {
_id: "$origId",
"list of objects": {
$push: {
string_1: "$_id.string_1",
string_2: "$_id.string_2",
string_3: "$string_3"
}
},
string: {$first: "$string"}
}
}
])

看看它是如何在操场上工作的例子

如果你想更新你现有的收藏,请在最后添加这个:

{$merge: {into: <your collection name>}} 

并替换为您的实际集合名称。

最新更新