如何在mongo集合中获得由2个键标识的重复元素?

时间:2013-05-13 12:11:33

标签: mongodb duplicates aggregation-framework

我有一个包含几百万个文档的集合,我需要找到至少重复的文档。复制标准基于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专家,但我必须以这种或那种方式做到这一点。

提前致谢

2 个答案:

答案 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/