1

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

提前致谢

4

2 回答 2

1

您尽可能缩小文档的想法$concat是一个很好的想法,但$concat它是一个$project操作员,而不是一个$group操作员。所以尝试这样的事情:

db.collection.aggregate(
    { $project: { _id: { $concat: ["$property1", ":", "$property2"] }}},
    { $group: { _id: '$_id', c: { $sum: 1 }}},
    { $match: { c: { $gt: 1 }}})

它仍然可能使用太多内存,但值得一试。

于 2013-05-14T13:03:53.237 回答
0

使用 map-reduce 是一种替代方法。在这里您可以找到示例:

http://docs.mongodb.org/manual/tutorial/map-reduce-examples/

于 2013-05-14T10:51:44.040 回答