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

MongoDB配列をクエリし、最も一致する要素で並べ替えます

    簡単ではありませんが、集約フレームワークを使用してこれを行うことができます。問題は、$inがないことにあります。 集約フレームワークの一部としての演算子。したがって、配列内の各項目をプログラムで一致させる必要があり、これは非常に面倒になります。 編集$inの場合、一致が最初になるように並べ替えられました かなりの部分を除外するのに役立ちます。

    db.test.aggregate(
      {$match:{"array.1":{$in:[100, 140,80]}}}, // filter to the ones that match
      {$unwind:"$array.1"}, // unwinds the array so we can match the items individually
      {$group: { // groups the array back, but adds a count for the number of matches
        _id:"$_id", 
        matches:{
          $sum:{
            $cond:[
              {$eq:["$array.1", 100]}, 
              1, 
              {$cond:[
                {$eq:["$array.1", 140]}, 
                1, 
                {$cond:[
                  {$eq:["$array.1", 80]}, 
                  1, 
                  0
                  ]
                }
                ]
              }
              ]
            }
          }, 
        item:{$first:"$array.item"}, 
        "1":{$push:"$array.1"}
        }
      }, 
      {$sort:{matches:-1}}, // sorts by the number of matches descending
      {$project:{matches:1, array:{item:"$item", 1:"$1"}}} // rebuilds the original structure
    );
    

    出力:

    {
    "result" : [
        {
            "_id" : ObjectId("50614c02162d92b4fbfa4448"),
            "matches" : 2,
            "array" : {
                "item" : 3,
                "1" : [
                    100,
                    90,
                    140
                ]
            }
        },
        {
            "_id" : ObjectId("50614bb2162d92b4fbfa4446"),
            "matches" : 1,
            "array" : {
                "item" : 1,
                "1" : [
                    100,
                    130,
                    255
                ]
            }
        }
    ],
    "ok" : 1
    }
    

    matchesを残すことができます $projectから除外すると、結果からフィールドが除外されます 最後に。




    1. コマンドがエラー168(InvalidPipelineOperator)で失敗しました:'認識されない式'$ match '

    2. MongoDBバウンドクエリ:マイルをラジアンに変換するにはどうすればよいですか?

    3. ルーメン-mongodb-jenssegers/laravel-mongodb-郵便配達員

    4. マングースのコレクションリストを取得するにはどうすればよいですか?