MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como filtrar array no subdocumento com o MongoDB


Usando aggregate é a abordagem certa, mas você precisa $unwind a list array antes de aplicar o $match para que você possa filtrar elementos individuais e então usar $group para colocá-lo de volta:
db.test.aggregate([
    { $match: {_id: ObjectId("512e28984815cbfcb21646a7")}},
    { $unwind: '$list'},
    { $match: {'list.a': {$gt: 3}}},
    { $group: {_id: '$_id', list: {$push: '$list.a'}}}
])

saídas:
{
  "result": [
    {
      "_id": ObjectId("512e28984815cbfcb21646a7"),
      "list": [
        4,
        5
      ]
    }
  ],
  "ok": 1
}

Atualização do MongoDB 3.2

A partir da versão 3.2, você pode usar o novo $filter operador de agregação para fazer isso de forma mais eficiente, incluindo apenas a list elementos que você deseja durante um $project :
db.test.aggregate([
    { $match: {_id: ObjectId("512e28984815cbfcb21646a7")}},
    { $project: {
        list: {$filter: {
            input: '$list',
            as: 'item',
            cond: {$gt: ['$$item.a', 3]}
        }}
    }}
])