sql >> Database >  >> NoSQL >> MongoDB

Haal alleen het opgevraagde element op in een objectarray in de MongoDB-verzameling

MongoDB 2.2's nieuwe $elemMatch projectie-operator biedt een andere manier om het geretourneerde document te wijzigen zodat het alleen de eerste . bevat overeenkomende shapes element:

db.test.find(
    {"shapes.color": "red"}, 
    {_id: 0, shapes: {$elemMatch: {color: "red"}}});

Retourneren:

{"shapes" : [{"shape": "circle", "color": "red"}]}

In 2.2 kunt u dit ook doen met de $ projection operator , waarbij de $ in een projectieobject vertegenwoordigt veldnaam de index van het eerste overeenkomende array-element van het veld uit de query. Het volgende geeft dezelfde resultaten als hierboven:

db.test.find({"shapes.color": "red"}, {_id: 0, 'shapes.$': 1});

MongoDB 3.2-update

Vanaf release 3.2 kun je de nieuwe $filter . gebruiken aggregatie-operator om een ​​array te filteren tijdens projectie, wat het voordeel heeft dat alle . wordt opgenomen overeenkomsten, in plaats van alleen de eerste.

db.test.aggregate([
    // Get just the docs that contain a shapes element where color is 'red'
    {$match: {'shapes.color': 'red'}},
    {$project: {
        shapes: {$filter: {
            input: '$shapes',
            as: 'shape',
            cond: {$eq: ['$$shape.color', 'red']}
        }},
        _id: 0
    }}
])

Resultaten:

[ 
    {
        "shapes" : [ 
            {
                "shape" : "circle",
                "color" : "red"
            }
        ]
    }
]


  1. MongoDB - Equivalent van LEFT JOIN waar één verzameling niet bestaat

  2. Redis AOF fsync (ALTIJD) vs. LSM-boom

  3. StackExchange.Redis ConnectionMultiplexer-pool voor synchrone methoden

  4. Grote gegevensworkflows met panda's