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

MongoDb:クエリ内の2つの配列から共通の要素を検索します

    やりたいことを行うにはいくつかのアプローチがありますが、それはMongoDBのバージョンによって異なります。シェルの応答を送信するだけです。コンテンツは基本的にJSON表現であり、JavaのDBObjectエンティティ、またはサーバー上で実行されるJavaScriptに変換するのは難しくないため、実際には変更されません。

    最初の最速のアプローチは、MongoDB 2.6以降を使用して、新しいセット操作を取得することです。

    var test = [ "t3", "t4", "t5" ];
    
    db.collection.aggregate([
       { "$match": { "tags": {"$in": test } }},
       { "$project": {
           "tagMatch": {
               "$setIntersection": [
                   "$tags",
                   test
               ]
           },
           "sizeMatch": {
               "$size": {
                   "$setIntersection": [
                       "$tags",
                       test
                   ]
               }
           }
       }},
       { "$match": { "sizeMatch": { "$gte": 1 } } },
       { "$project": { "tagMatch": 1 } }
    ])
    

    新しい演算子は、 $ setIntersection> それが主な作業を行っており、 $サイズ 配列サイズを測定し、後者のフィルタリングに役立つ演算子。これは、交差するアイテムを見つけるための「セット」の基本的な比較になります。

    以前のバージョンのMongoDBを使用している場合でも、これは可能ですが、さらにいくつかのステージが必要であり、アレイが大きい場合はパフォーマンスに多少影響する可能性があります。

    var test = [ "t3", "t4", "t5" ];
    
    db.collection.aggregate([
       { "$match": { "tags": {"$in": test } }},
       { "$project": {
          "tags": 1,
          "match": { "$const": test }
       }},
       { "$unwind": "$tags" },
       { "$unwind": "$match" },
       { "$project": {
           "tags": 1,
           "matched": { "$eq": [ "$tags", "$match" ] }
       }},
       { "$match": { "matched": true }},
       { "$group": {
           "_id": "$_id",
           "tagMatch": { "$push": "$tags" },
           "count": { "$sum": 1 }
       }}
       { "$match": { "count": { "$gte": 1 } }},
       { "$project": { "tagMatch": 1 }}
    ])
    

    または、それらすべてが関係しているように見える場合、またはアレイがパフォーマンスの違いを生むのに十分な大きさである場合は、常に mapReduce

    var test = [ "t3", "t4", "t5" ];
    
    db.collection.mapReduce(
        function () {
          var intersection = this.tags.filter(function(x){
              return ( test.indexOf( x ) != -1 );
          });
          if ( intersection.length > 0 ) 
              emit ( this._id, intersection );
       },
       function(){},
       {
           "query": { "tags": { "$in": test } },
           "scope": { "test": test },
           "output": { "inline": 1 }
       }
    )
    

    すべての場合において、 $ in 演算子は、完全に一致していなくても、結果を減らすのに役立ちます。もう1つの一般的な要素は、交差結果の「サイズ」をチェックして応答を減らすことです。

    コーディングは非常に簡単です。最良の結果を得るためにまだそこにいない場合は、上司にMongoDB2.6以降に切り替えるように説得してください。




    1. Redisでパターンに一致するキーを削除する方法

    2. golangとmongodbでidで検索する方法

    3. マングースルートでの約束の使用

    4. ApacheHadoopを使用したほぼリアルタイムのデータ処理のアーキテクチャパターン