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

Mongoose - wyszukiwanie poddokumentów według kryteriów

Możesz użyć $elemMatch jako operator zapytania-projekcji w najnowszych wersjach MongoDB. Z muszli mongo:

db.parents.find(
    {'children.age': {$gte: 18}},
    {children:{$elemMatch:{age: {$gte: 18}}}})

To odfiltrowuje dokumenty młodszych dzieci z grupy children tablica:

{ "_id" : ..., "children" : [ { "name" : "Margaret", "age" : 20 } ] }
{ "_id" : ..., "children" : [ { "name" : "John", "age" : 22 } ] }

Jak widać, dzieci nadal są pogrupowane w swoich dokumentach nadrzędnych. MongoDB zapytania zwracają dokumenty z kolekcji. Możesz użyć struktury agregacji $unwind metoda podziału ich na osobne dokumenty:

> db.parents.aggregate({
    $match: {'children.age': {$gte: 18}}
}, {
    $unwind: '$children'
}, {
    $match: {'children.age': {$gte: 18}}
}, {
    $project: {
        name: '$children.name',
        age:'$children.age'
    }
})
{
    "result" : [
        {
            "_id" : ObjectId("51a7bf04dacca8ba98434eb5"),
            "name" : "Margaret",
            "age" : 20
        },
        {
            "_id" : ObjectId("51a7bf04dacca8ba98434eb6"),
            "name" : "John",
            "age" : 22
        }
    ],
    "ok" : 1
}

Powtarzam $match klauzula wydajności:za pierwszym razem eliminuje rodziców z nie dzieci w wieku co najmniej 18 lat, więc $unwind uwzględnia tylko przydatne dokumenty. Drugi $match usuwa $unwind dane wyjściowe, które nie pasują, i $project przenosi informacje o dzieciach z poddokumentów do najwyższego poziomu.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Wykonywanie case-statement w ramach agregacji mongodb

  2. Czy źle jest zmienić typ _id w MongoDB na liczbę całkowitą?

  3. Wysyłasz zapytania do MongoDB GridFS?

  4. Agregacja MongoDB z sumą wartości tablicy

  5. MongoDB :znajdź wartość w tablicy z wieloma kryteriami