sql >> Databasteknik >  >> NoSQL >> MongoDB

Är det möjligt att använda frågeprojektion på samma samling som har en $elemMatch-projektion?

Ja, det finns två sätt att göra detta. Så du kan antingen använda $elemMatch på projektionssidan som du redan har, med små ändringar:

Model.findById(id,
   { "comments": { "$elemMatch": {"created.by": "Jane" } } },
   function(err,doc) {

Eller lägg bara till i frågedelen och använd den positionella $ operatör:

Model.findOne(
    { "_id": id, "comments.created.by": "Jane" },
    { "comments.$": 1 },
    function(err,doc) {

Båda sätten är helt giltiga.

Om du ville ha något lite mer involverat än så kan du använda .aggregate() metod och det är $project operatör istället:

Model.aggregate([
    // Still match the document
    { "$match": "_id": id, "comments.created.by": "Jane" },

    // Unwind the array
    { "$unwind": "$comments" },

    // Only match elements, there can be more than 1
    { "$match": "_id": id, "comments.created.by": "Jane" },

    // Project only what you want
    { "$project": {
        "comments": {
            "body": "$comments.body",
            "by": "$comments.created.by"
        }
    }},

    // Group back each document with the array if you want to
    { "$group": {
        "_id": "$_id",
        "comments": { "$push": "$comments" }
    }}
],
function(err,result) {

Så aggregeringsramverket kan användas för mycket mer än att bara aggregera resultat. Det är $project operatorn ger dig mer flexibilitet än vad som är tillgängligt för projicering med .find() . Det låter dig också filtrera och returnera flera arrayresultat, vilket också är något som inte kan göras med projektion i .find() .




  1. Det gick inte att ladda c++ bson-tillägget, med ren JS-version

  2. Hur använder man den dumpade informationen av mongodump?

  3. exkludera fält i $lookup-aggregation

  4. MongoDB:Unikt index på arrayelementets egenskap