1

少なくとも重複するドキュメントを見つける必要がある数百万のドキュメントを含むコレクションがあります。重複基準は、1 つではなく 2 つのキーに基づいています。したがって、両方が持っている少なくとも2つのドキュメントを見つける必要があります{ property1 : value1, property2 : value2,}

このために、次の例のように集約フレームワークを使用しようとしています:

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 }
                         }
               }
             )

同じ結果が得られました

これを行う方法を知っている人はいますか? 私は本当にモンゴの専門家ではありませんが、これを何らかの方法で行う必要があります。

前もって感謝します

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 に答える