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

クエリとまったく同じ配列エントリを持つドキュメントを検索する方法

    ここにはいくつかの「非常に便利なケース」があり、実際には配列コンテンツに対して「一意のハッシュ」を作成しようとすると、簡単に対処できる無数の問題が「邪魔」になります。

    「私」に共通する発見

    たとえば、提供されたサンプルから「user 1」を取得し、そのデータがすでにロードされていて、現在のユーザーオブジェクトが持っているものから一致する「itemsIds」によって「私と共通するもの」を見つけたい場合は、 2つの単純なクエリアプローチです:

    1. 「まったく同じ」を見つける: 他のユーザーデータを調べて、同じ「正確な」関心を持つユーザーを確認する場所です。これは、の単純で「順序付けられていない」使用法です。 $ all クエリ演算子:

      db.collection.find({ 
          "itemsIds": { "$all": [399957190, 366369952] },
          "userId": { "$ne": 1 }
      })
      

      これは、「両方」の共通の「itemsIds」エントリを持つものであるため、「user3」を返します。順序は、両方が存在する限り、どの順序でも常に一致するため、ここでは重要ではありません。これは$andの別の形式です クエリ引数として。

    2. 私に共通する「類似」を見つける: 基本的に、「同じものはありますか?」を尋ねているのはどれですか。 。そのためには、 $ in クエリ演算子。指定された条件の「いずれか」が満たされた場合に一致します:

      db.collection.find({ 
          "itemsIds": { "$in": [399957190, 366369952] },
          "userId": { "$ne": 1 }
      })
      

      この場合、「ユーザー2」と「ユーザー3」の「両方」が一致します。これは、指定された条件の「少なくとも」を「1つ」共有し、のソースデータと「共通点」があることを意味します。クエリ。

      これは実際、$またはの別の形式です。 クエリ演算子。以前と同じように、適用する条件を考慮して、このように記述する方がはるかに簡単で簡潔です。

    一般的な「もの」を見つける

    基本的な「ユーザー」から始めずに、「共通」のものを見つけたい場合もあります。では、「ユーザー1」と「ユーザー2」が同じ「itemIds」を共有していること、または実際にはさまざまなユーザーが同じ「itemIds」値を個別に共有している可能性があることをどのように判断しますか?

    1. 完全一致を取得する: もちろん、「itemsIds」の値と $ group それらを一緒に。通常、ここでは「順序が重要」であるため、最適には「事前注文」し、常にこれを次のように単純にするようにします。

      db.collection.aggregate([
          { "$group": {
              "_id": "$itemsIds",
              "common": { "$push": "$userId" }
          }}
      ])
      

      そして、注文がすでにある限り、それが本当にそこにあるすべてです。そうでない場合は、少し長く巻いたフォームを実行して「順序付け」を行うことができますが、「ハッシュ」を生成する場合も同じことが言えます。

      db.collection.aggregate([
          { "$unwind": "$itemsIds" },
          { "$sort": { "_id": 1, "itemsIds": 1 } },
          { "$group": {
              "_id": "$_id",
              "userId": { "$first": "$userId" },
              "itemsIds": { "$push": "$itemsIds" }
          }},
          { "$group": {
              "_id": "$itemsIds",
              "common": { "$push": "$userId" }
          }}
      ])
      

      「優れた」パフォーマンスではありませんが、配列エントリの追加で常に順序付けを続ける理由がわかります。これは非常に簡単なプロセスです。

    2. 一般的な「ユーザー」から「アイテム」: これは、 $ unwind の下の配列を「分解」することで、上記を抽象化するもう1つの単純なプロセスです。 、そして基本的にグループ化する:

      db.collection.aggregate([
          { "$unwind": "$itemsIds" },
          { "$group": {
              "_id": "$itemsIds",
              "users": { "$addToSet": "$userId" }
          }}
      ])
      

      繰り返しになりますが、 $の単純なグループ化アグリゲーターです。 addToSet ジョブを実行し、「itemsIds」値ごとに「distinctuserId」値を収集します。

    これらはすべて基本的な解決策であり、「交差点の設定」などを続けることもできますが、これが「入門書」です。

    「ハッシュ」を計算しようとしないでください。MongoDBには、とにかくエントリを照合するための優れた「武器」があります。それを使用し、それが壊れるまで「乱用」します。その後、もっと頑張ってください。




    1. 集約フレームワークmongodbでの$unwindと$textの使用

    2. MongoIdオブジェクトの配列を文字列の配列に変換します

    3. MongoDB $ exp

    4. コレクションを1000単位で読み通す方法は?