sql >> Databáze >  >> NoSQL >> MongoDB

Mongoose - vyhledávání vnořených dokumentů podle kritérií

Můžete použít $elemMatch jako operátor dotazu-projekce v nejnovějších verzích MongoDB. Z mongo shell:

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

To odfiltruje dokumenty mladších dětí z children pole:

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

Jak vidíte, děti jsou stále seskupeny ve svých nadřazených dokumentech. Dotazy MongoDB vracejí dokumenty z kolekcí. Můžete použít $unwind agregačního rámce způsob, jak je rozdělit do samostatných dokumentů:

> 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
}

Opakuji $match doložka o výkonu:poprvé prostřednictvím ní eliminuje rodiče s ne děti alespoň 18 let, takže $unwind považuje pouze za užitečné dokumenty. Druhý $match odstraní $unwind výstup, který se neshoduje, a $project zvedne informace o dětech z dílčích dokumentů na nejvyšší úroveň.



  1. vytvářet a aktualizovat více dokumentů MongoDB v jednom volání

  2. spring-redis se nemůže připojit ke vzdálenému hostiteli

  3. Redis distribuovaný přírůstek s aretací

  4. Napište svého prvního poradce