sql >> Database >  >> NoSQL >> MongoDB

Mongoose - subdocumenten zoeken op criteria

U kunt $elemMatch . gebruiken als een query-projectie-operator in de meest recente MongoDB-versies. Van de mongo-schelp:

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

Dit filtert documenten van jongere kinderen uit de children reeks:

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

Zoals u kunt zien, zijn kinderen nog steeds gegroepeerd in hun bovenliggende documenten. MongoDB-query's retourneren documenten uit verzamelingen. U kunt de $unwind . van het aggregatieraamwerk gebruiken methode om ze in afzonderlijke documenten te splitsen:

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

Ik herhaal de $match clausule voor prestaties:de eerste keer door het elimineert ouders met nee kinderen minstens 18 jaar oud, dus de $unwind beschouwt alleen nuttige documenten. De tweede $match verwijdert $unwind uitvoer die niet overeenkomt, en de $project hijst kinderinfo uit subdocumenten naar het hoogste niveau.



  1. Hoe verwijder ik documenten met Node.js Mongoose?

  2. Hoe kan ik slechts één database opslaan in Redis?

  3. is er een manier om de cliënt IP in redis te krijgen?

  4. mgo - queryprestaties lijken constant traag (500-650ms)