sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man filtrerar array i underdokument med MongoDB

Använder aggregate är rätt tillvägagångssätt, men du måste $unwind list array innan du använder $match så att du kan filtrera enskilda element och sedan använda $group för att sätta ihop det igen:

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

utgångar:

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

MongoDB 3.2-uppdatering

Från och med version 3.2 kan du använda det nya $filter aggregeringsoperatör för att göra detta mer effektivt genom att endast inkludera list element du vill ha under ett $project :

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


  1. ImportError:Ingen modul med namnet objectid

  2. räkna antal sessioner i connect-redis

  3. Draft.js - Kan inte hämta data från databasen. Cross-origin fel

  4. MongoDB - distinkt med fråga använder inte index