我有这样的文件:
{
"_id" : ObjectId("557eaf444ba222d545c3dffc"),
"foreing" : ObjectId("538726124ba2222c0c0248ae"),
"value" : "test",
}
我想查找对foreing
&对的所有重复值的文档。 value
。
答案 0 :(得分:21)
您可以通过运行以下聚合管道操作轻松识别重复项:
db.collection.aggregate([
{
"$group": {
"_id": { "foreing": "$foreing", "value": "$value" },
"uniqueIds": { "$addToSet": "$_id" },
"count": { "$sum": 1 }
}
},
{ "$match": { "count": { "$gt": 1 } } }
])
第一步中的 $group
运算符用于按foreign
和value
键值对文档进行分组,然后创建一个{{{使用 $addToSet
运算符将每个分组文档的值设置为_id
字段。这为您提供了每组的唯一表达式值数组。使用 $sum
运算符获取要在后续管道阶段中使用的分组文档总数。
在第二个管道阶段,使用 $match
运算符过滤掉所有计数为1的文档。过滤掉的文档代表唯一索引键。
其余文档将是集合中具有对uniqueIds
&对的重复键值的文档。 foreing
。
答案 1 :(得分:12)
我们只需要在2个键的基础上进行分组,并选择计数大于1的元素,以查找重复项。
查询: - 就像
db.mycollection.aggregate(
{ $group: {
_id: { foreing: "$foreing", value: "$value" },
count: { $sum: 1 },
docs: { $push: "$_id" }
}},
{ $match: {
count: { $gt : 1 }
}}
)
输出: - 就像
{
"result" : [
{
"_id" : {
"foreing" : 1,
"value" : 2
},
"count" : 2,
"docs" : [
ObjectId("34567887654345678987"),
ObjectId("34567887654345678987")
]
}
],
"ok" : 1
}