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

вземете всички документи с максимална стойност, като използвате агрегиране в mongodb

Ако искате да запазите информация за документа, тогава основно трябва да $push го в масив. Но, разбира се, тогава разполагате с вашия $max стойности, трябва да филтрирате съдържанието на масива само за елементите, които съответстват:

db.coll.aggregate([
    { "$group":{ 
        "_id": "$country",
        "maxQuantity": { "$max": "$quantity" },
        "docs": { "$push": {
            "_id": "$_id",
            "name": "$name",
            "quantity": "$quantity"
        }}
    }},
    { "$project": {
        "maxQuantity": 1,
        "docs": {
            "$setDifference": [
               { "$map": {
                   "input": "$docs",
                   "as": "doc",
                   "in": {
                       "$cond": [ 
                           { "$eq": [ "$maxQuantity", "$$doc.quantity" ] },
                           "$$doc",
                           false
                       ]
                   }
               }},
               [false]
            ]
        }
    }}
])

Така че съхранявате всичко в масив и след това тествате всеки член на масива, за да видите дали неговата стойност съвпада с тази, която е записана като максимална, като отхвърляте всички, които не съвпадат.

Бих запазил _id стойности в документите на масива, тъй като това ги прави „уникални“ и няма да бъдат повлияни неблагоприятно от $setDifference при филтриране на стойности. Но, разбира се, ако „име“ винаги е уникално, то няма да се изисква.

Можете също така просто да върнете каквито полета искате от $map , но просто връщам целия документ например.

Имайте предвид, че това има ограничението да не надвишава ограничението за размер на BSON от 16MB, така че е добре за малки извадки от данни, но всичко, което създава потенциално голям списък (тъй като не можете предварително да филтрирате съдържанието на масива), би било по-добре да се обработи с отделна заявка за намиране на „максималните“ стойности и друга за извличане на съответстващите документи.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB фрагмент по дата на една машина

  2. Има ли начин да се проектира типа на полето

  3. премахнете _id от резултата от mongo

  4. Търсене на местоположения с API на Google Maps за Android

  5. sailsjs все още използва база данни по подразбиране, след като я промени на mongodb