MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Wybierz ostatnią wartość tablicy w poddokumencie

Aby to zrobić, potrzebujesz ram agregacji, myślę, że naprawdę powinieneś zmienić strukturę, ale pracując z tym, co masz:

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

W przyszłych wydaniach będziesz mógł po prostu używać nowego $slice operator:

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

W rzeczywistości możesz wykonać „oba” pola jednocześnie:

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

A to o wiele lepsze niż przetwarzanie za pomocą $unwind i $last aby pobrać ostatni element tablicy, gdy $group jest stosowany w celu odzyskania danych.

Zasadniczo ma taką samą wydajność jak zwykłe zapytanie w nowszej formie. W obecnej formie będzie wolniej.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. uzyskaj wszystkie dokumenty o maksymalnej wartości za pomocą agregacji w mongodb

  2. Jak przekonwertować mongodb ISODate na ciąg w mongoDB?

  3. Wstaw element do zagnieżdżonej tablicy w Mongodb

  4. MongoDB $strLenCP

  5. konwertowanie z bloba na binarny, aby zapisać go w mongodb