sql >> Database >  >> NoSQL >> MongoDB

Hoe array in subdocument te filteren met MongoDB

aggregate gebruiken is de juiste aanpak, maar je moet $unwind de list array voor het toepassen van de $match zodat u individuele elementen kunt filteren en vervolgens $group . kunt gebruiken om het weer in elkaar te zetten:

db.test.aggregate([
    { $match: {_id: ObjectId("512e28984815cbfcb21646a7")}},
    { $unwind: '$list'},
    { $match: {'list.a': {$gt: 3}}},
    { $group: {_id: '$_id', list: {$push: '$list.a'}}}
])

uitgangen:

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

MongoDB 3.2-update

Vanaf release 3.2 kun je de nieuwe $filter . gebruiken aggregatie-operator om dit efficiënter te doen door alleen de list . op te nemen elementen die je wilt tijdens een $project :

db.test.aggregate([
    { $match: {_id: ObjectId("512e28984815cbfcb21646a7")}},
    { $project: {
        list: {$filter: {
            input: '$list',
            as: 'item',
            cond: {$gt: ['$$item.a', 3]}
        }}
    }}
])


  1. De strijd om de NoSQL-databases - MongoDB en de NoSQL-functies van MSSQL vergelijken

  2. RedisClient LUA API's

  3. Installeer MongoDB Community Edition 4.0 op Linux

  4. Mongodb $lookup dynamische collectie