我有一个包含几百万个文档的集合,我需要找到至少重复的文档。复制标准基于2个键,而不是一个。所以我需要找到至少2个都有{ property1 : value1, property2 : value2,}
的文件。
为此,我尝试使用聚合framewotk,如下例所示:
db.listings.aggregate({
$group:
{
_id : { property1 : "$property1", property2 : "$property2" },
count: { $sum: 1 }
},},{
$match : {
count: {
$gt : 1
}
}},{
$limit: 1})
我认为这应该有效,但是 Mongo返回以下错误:
{
"code" : 16390,
"ok" : 0,
"errmsg" : "exception: sharded pipeline failed on shard shard1: { errmsg: \"exception: aggregation result exceeds maximum document size (16MB)\", code: 16389, ok: 0.0}"
我也试过
db.collection.aggregate( { $group: { _id:
{ $concat: [ "$property1",
": ",
"$property2"
]
},
count: { $sum: 1 }
}
}
)
得到了相同的结果
有谁有更好的想法如何做到这一点?我不是真正的mongo专家,但我必须以这种或那种方式做到这一点。
提前致谢
答案 0 :(得分:1)
您希望使用$concat
尽可能缩小文档是合适的,但$concat
是$project
运算符,而不是$group
运算符。所以尝试这样的事情:
db.collection.aggregate(
{ $project: { _id: { $concat: ["$property1", ":", "$property2"] }}},
{ $group: { _id: '$_id', c: { $sum: 1 }}},
{ $match: { c: { $gt: 1 }}})
它仍然可能使用太多内存,但它值得一试。
答案 1 :(得分:0)
使用map-reduce是另一种选择。在这里你可以找到例子:
http://docs.mongodb.org/manual/tutorial/map-reduce-examples/