sql >> データベース >  >> NoSQL >> MongoDB

キーフィールドでMongoDBコレクション内のすべての重複ドキュメントを検索

    受け入れられた答えは、大きなコレクションではひどく遅く、_idを返しません 重複するレコードのs。

    集計ははるかに高速で、_idを返すことができます s:

    db.collection.aggregate([
      { $group: {
        _id: { name: "$name" },   // replace `name` here twice
        uniqueIds: { $addToSet: "$_id" },
        count: { $sum: 1 } 
      } }, 
      { $match: { 
        count: { $gte: 2 } 
      } },
      { $sort : { count : -1} },
      { $limit : 10 }
    ]);
    

    集約パイプラインの最初の段階では、$groupoperatorはnameによってドキュメントを集約します。 フィールドとuniqueIdsに保存 各_id グループ化されたレコードの値。$sum演算子は、渡されたフィールドの値(この場合は定数1)を合計します。 -これにより、グループ化されたレコードの数をcountにカウントします フィールド。

    パイプラインの第2段階では、$ matchを使用して、countでドキュメントをフィルタリングします。 少なくとも2つ、つまり重複している。

    次に、最も頻繁な重複を最初に並べ替え、結果を上位10に制限します。

    このクエリは最大$limitを出力します 重複する名前のレコードとその_id s。例:

    {
      "_id" : {
        "name" : "Toothpick"
    },
      "uniqueIds" : [
        "xzuzJd2qatfJCSvkN",
        "9bpewBsKbrGBQexv4",
        "fi3Gscg9M64BQdArv",
      ],
      "count" : 3
    },
    {
      "_id" : {
        "name" : "Broom"
      },
      "uniqueIds" : [
        "3vwny3YEj2qBsmmhA",
        "gJeWGcuX6Wk69oFYD"
      ],
      "count" : 2
    }
    


    1. RedisとMemcached–2021の比較

    2. クライアントIPをredisで取得する方法はありますか?

    3. マングーススキーマに2dsphereインデックスを適用すると、ロケーションフィールドが必須になりますか?

    4. 同じタスクが複数回実行された