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

Jak użyć $slice a $filtra w MongoDB?

Jednym ze sposobów na zrobienie tego byłoby to (nie ma potrzeby etapu $match, w zależności od struktury danych i konfiguracji indeksowania, ale ze względu na wydajność możesz nadal chcieć to zachować):

 db.item.aggregate([
    { "$project": { 
        "items": { 
            "$slice": [ 
                { "$filter": { 
                    "input": "$items",
                    "as": "item", 
                    "cond": { "$eq": [ "$$item.status", "active" ] } 
                }}, 
                -3,2 
            ] 
        } 
    }}
])

Myślę jednak, że prawdopodobnie lepiej będzie użyć następującego zapytania:

db.items.db.aggregate([
{
    $project: {
        "items": {
            "$filter": { 
                "input": "$items",
                "as": "item", 
                "cond": { "$eq": [ "$$item.status", "active" ] } 
            }
        } 
    }
}, {
    $project: {
        "items": {
            $slice: [
                {
                    $slice: [
                        "$items",
                        {
                            $subtract: [ { $size: "$items" }, 1 ] // length of items array minus one
                        } 
                    ]
                }, 2 // max two elements
            ]
        }
    }
}])

ponieważ ten najpierw usunie ostatni element, a następnie ograniczy wynik do dwóch elementów, co jest prawdopodobnie bardziej tym, czego chcesz w sytuacji z mniej niż 3 "aktywnymi" elementami.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Powłoka mongod nie uruchamia się, dane/db nie istnieją

  2. Zbiorcza aktualizacja/zastąpienie Mongodb C# w podkolekcji

  3. Jak - wiele aplikacji Meteor na jednej MongoDB - te same kolekcje?

  4. Dlaczego nie mogę uruchomić wyjaśnienia podczas aktualizacji MongoDB?

  5. Jak sprawdzić połączenie z mongodb