web-dev-qa-db-ja.com

Mongoは2つ以上のフィールドのエントリの重複を検出します

私はこのような文書を持っています:

{
    "_id" : ObjectId("557eaf444ba222d545c3dffc"),
    "foreing" : ObjectId("538726124ba2222c0c0248ae"),
    "value" : "test",
}

foreingvalueのペアの値が重複しているすべてのドキュメントを検索したい。

21

次の集計パイプライン操作を実行することで、重複を簡単に識別できます。

db.collection.aggregate([
    { 
        "$group": { 
            "_id": { "foreing": "$foreing", "value": "$value" }, 
            "uniqueIds": { "$addToSet": "$_id" },
            "count": { "$sum": 1 } 
        }
    }, 
    { "$match": { "count": { "$gt": 1 } } }
])

最初のステップの$group演算子は、foreignによってドキュメントをグループ化するために使用されますおよびvalueキー値を使用して、グループ化された各ドキュメントの_id値の配列をuniqueIdsフィールドとして$addToSet演算子。これにより、グループごとに一意の式の値の配列が得られます。 $sum演算子を使用して、後のパイプラインステージで使用するグループ化されたドキュメントの総数を取得します。

2番目のパイプラインステージで、$match演算子を使用して、カウント1のすべてのドキュメントをフィルターで除外します。除外されたドキュメントは一意のインデックスキーを表します。

残りのドキュメントは、foreingvalueのペアのキー値が重複しているコレクション内のドキュメントになります。

29
chridam

重複を見つけるには、2つのキーのベースでグループ化し、カウントが1より大きい要素を選択するだけです。

Query:-のようになります

db.mycollection.aggregate(
    { $group: { 
        _id: { foreing: "$foreing", value: "$value" },
        count: { $sum:  1 },
        docs: { $Push: "$_id" }
    }},
    { $match: {
        count: { $gt : 1 }
    }}
)

[〜#〜] output [〜#〜]:-のようになります

{
    "result" : [
        {
            "_id" : {
                "foreing" : 1,
                "value" : 2
            },
            "count" : 2,
            "docs" : [
                ObjectId("34567887654345678987"),
                ObjectId("34567887654345678987")
            ]
        }
    ],
    "ok" : 1
}

参照リンク:- 同じフィールドを持つmongoドキュメントを見つける方法

16
Nishant