MongoDB
 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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose TypeError:Не може да се използва оператор „in“ за търсене на „_id“ в [object Object]

  2. MongoDb:как да създадете правилния (съставен) индекс за данни с много полета за търсене

  3. Как да сортирам колекция въз основа на стойности в масив

  4. Най-добрата практика на MongoDB за преброяване на свързани документи

  5. Импортиране на json от файл в mongodb с помощта на mongoimport