sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongoose - at finde underdokumenter efter kriterier

Du kan bruge $elemMatch som forespørgselsprojektionsoperatør i de seneste MongoDB-versioner. Fra mongo-skallen:

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

Dette filtrerer yngre børns dokumenter ud af children array:

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

Som du kan se, er børn stadig grupperet i deres overordnede dokumenter. MongoDB-forespørgsler returnerer dokumenter fra samlinger. Du kan bruge aggregeringsrammernes $unwind metode til at opdele dem i separate dokumenter:

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

Jeg gentager $match klausul for præstation:første gang gennem det eliminerer forældre med nej børn på mindst 18 år, så $unwind tager kun hensyn til nyttige dokumenter. Den anden $match fjerner $unwind output, der ikke matcher, og $project hejser børns info fra underdokumenter til øverste niveau.



  1. Omdøb et felt i forespørgselsresultaterne i MongoDB

  2. Oprettelse af en redis-lytter - muligt i php?

  3. Afkodning af MongoDB fejllogfiler

  4. Hvordan kan man atomisk slette millioner af nøgler, der matcher et mønster ved hjælp af ren Redis?