sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongoose - hitta underdokument efter kriterier

Du kan använda $elemMatch som en frågeprojektionsoperatör i de senaste MongoDB-versionerna. Från mongoskalet:

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

Detta filtrerar bort yngre barns dokument från children array:

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

Som du kan se är barn fortfarande grupperade i sina överordnade dokument. MongoDB-frågor returnerar dokument från samlingar. Du kan använda aggregeringsramverkets $unwind metod för att dela upp dem i separata 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
}

Jag upprepar $match klausul för prestation:första gången genom det eliminerar föräldrar med nej barn som är minst 18 år, så $unwind tar endast hänsyn till användbara dokument. Den andra $match tar bort $unwind utdata som inte matchar, och $project lyfter barninformation från underdokument till toppnivå.



  1. MongoDB $arrayToObject

  2. Arbetar du med kapslade objekt i Redis?

  3. Varför du fortfarande borde använda MMAPv1 Storage Engine för MongoDB

  4. Använder Redis ett användarnamn för autentisering?