MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Ред на резултатите в MongoDB с $in?

Като цяло:ако търсите без указан ред на сортиране, няма гарантирано подреждане на резултатите.

Освен това не е възможно да сортирате по масив (още по-малко, ако искате да сортирате масив по масив, както е описано). sort() използва логическо сравнение, за да определи възходящ или низходящ ред въз основа на поле във вашите документи с резултати.

Ще трябва да приложите всяка желана персонализирана логика за сортиране в собствения си код на приложение.

Полезен подход може да бъде да се възползвате от новата Aggregation Framework в MongoDB 2.2 .. по-специално възможността за $unwind масив в поток от документи.

Например настройка на тестови данни като:

{ "_id" : ObjectId("504ac93fb50571321b2f932a"), "a" : [ 1, 2, 4 ] }
{ "_id" : ObjectId("504ac946b50571321b2f932b"), "a" : [ 5, 4, 9 ] }
{ "_id" : ObjectId("504ac94eb50571321b2f932c"), "a" : [ 2, 1, 3 ] }
{ "_id" : ObjectId("504ac954b50571321b2f932d"), "a" : [ 7, 3, 9 ] }

$in търсенето на [2,3] ще доведе до съответстващите документи:

> db.matches.find({'a': { $in: [2,3]}})
{ "_id" : ObjectId("504ac93fb50571321b2f932a"), "a" : [ 1, 2, 4 ] }
{ "_id" : ObjectId("504ac94eb50571321b2f932c"), "a" : [ 2, 1, 3 ] }
{ "_id" : ObjectId("504ac954b50571321b2f932d"), "a" : [ 7, 3, 9 ] }

С рамката за агрегиране можете да $match същите документи и след това манипулирайте резултатите, за да постигнете някакво основно сортиране:$unwind масивите, $sort тях и след това $group тези обратно в резултат:

db.matches.aggregate(
  { $match : {
       a: { $in: [2,3] }
  }},
  { $unwind : "$a" },
  { $sort: {
      "a": -1
  }},
  { $group : {
      _id: '$_id',
      a: { $addToSet: "$a" }
  }}
)

Така че в този пример документите със съвпадащи масиви вече са сортирани във възходящ ред за стойностите на масива:

{
    "result" : [
        {
            "_id" : ObjectId("504ac94eb50571321b2f932c"),
            "a" : [ 1, 2, 3]
        },
        {
            "_id" : ObjectId("504ac93fb50571321b2f932a"),
            "a" : [ 1, 2, 4 ]
        },
        {
            "_id" : ObjectId("504ac954b50571321b2f932d"),
            "a" : [ 3, 7, 9 ]
        }
    ],
    "ok" : 1
}


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Запитване за масиви от вложени обекти

  2. Актуализиране на елементи в масив

  3. MongoDB C# драйвер - Игнорирайте полетата при обвързване

  4. MongoDB отчита броя на новите документи на минута въз основа на _id

  5. Pymongo, заявка в полето за списък и/или