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

Възможно ли е да сортирате, групирате и ограничавате ефективно в Mongo с конвейер?

За да отговорите на първия си въпрос:$group не запази реда. Има отворени заявки за промени, които също подчертават малко фона, но не изглежда, че продуктът ще бъде променен, за да запази реда на входните документи:

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

Второ, MongoDB ще се погрижи да сортира възможно най-ефективно и малко. документация заявява:

Така че този код върши работата във вашия случай:

collection.aggregate({
    $group: {
        _id: '$age',
        names: { $push: '$name' }
    }
}, {
    $sort: { 
        '_id': 1 
    }
}, {
    $limit: 10
})

РЕДАКТИРАНЕ след вашите коментари:

Съгласен съм с това, което казваш. И като продължа логиката ви малко по-далеч, бих стигнал дотам, че да кажа:Ако $group беше достатъчно умен, за да използва индекс, тогава дори не би трябвало да изисква $sort етап в началото. За съжаление не е (все още не е вероятно). Както стоят нещата днес, $group никога няма да използва индекс и няма да използва преки пътища въз основа на следните етапи ($limit в такъв случай). Вижте също тази връзка където някой е провел някои основни тестове.

Рамката за агрегиране е все още доста млада, така че предполагам, че има много работа, за да стане тръбопроводът за агрегиране по-интелигентен и по-бърз.

Има отговори тук в StackOverflow (напр. тук ), където хората предлагат да се използва предварително $sort етап, за да „принуди“ MongoDB да използва по някакъв начин индекс. Това обаче забави моите тестове (1 милион записа на формата на вашата извадка, използвайки различни произволни разпределения) значително.

Когато става дума за производителност на тръбопровод за агрегиране, $match етапите в началото са това, което наистина помага най-много. Ако можете да ограничите общото количество записи, които трябва да преминат през конвейера от самото начало, тогава това е най-добрият ви залог - очевидно...;)




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. RangeError:Невалиден код на състоянието:0

  2. Как да създавате индекси в MongoDB чрез .NET

  3. Актуализиране на обект на масив въз основа на идентификатора?

  4. Използване на библиотека mongodb-stitch в Angular 4

  5. Промяна на директорията за съхранение на данни MongoDB