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

Изберете последната стойност на масива в поддокумент

Имате нужда от рамка за агрегиране, за да направите това, мисля, че наистина трябва да промените структурата, но работейки с това, което имате:

Model.aggregate(
    [
       { "$match": { "prices.100": { "$exists": true } }},
       { "$unwind": "$prices.100" },
       { "$group": {
          "_id": "$_id",
          "price": { "$last": "$prices.100" }
       }},
       { "$project": { "_id": 0, "prices.100": "$price" } }
     ]
) 

В бъдещите версии ще можете да използвате само новия $slice оператор:

Model.aggregate(
    [
        { "$match": { "prices.100": { "$exists": true } } },
        { "$project": {
            "_id": 0,
            "prices.100": { "$slice": ["$prices.100",-1] }
        }}
    ]
)

Всъщност можете да направите „и двете“ полета едновременно:

Model.aggregate(
    [
        { "$match": { "prices.100": { "$exists": true } } },
        { "$project": {
            "_id": 0,
            "prices.100": { "$slice": ["$prices.100",-1] },
            "prices.101": { "$slice": ["$prices.100",-1] }
        }}
    ]
)

И това е много по-добре от обработката с $unwind и $last за да получите последния елемент от масива, когато $group се прилага за връщане на данните.

По принцип има същата производителност като обикновена заявка в по-новата форма. В настоящата форма ще бъде по-бавно.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Вземане на сума от колона в MongoDB

  2. MongoDB:Възможно ли е да се ограничат резултатите от $lookup до определени полета (като проекция)?

  3. Как мога да проверя дали командата за актуализиране на mongo е успешна в node

  4. Защо Mongoose има както схеми, така и модели?

  5. MongoDB $atan