mongodb - 如何使用 MongoDB 过滤子文档中的数组

我在子文档中有这样的数组

{
    "_id" : ObjectId("512e28984815cbfcb21646a7"),
    "list" : [
        {
            "a" : 1
        },
        {
            "a" : 2
        },
        {
            "a" : 3
        },
        {
            "a" : 4
        },
        {
            "a" : 5
        }
    ]
}

我可以为 > 3 过滤子文档

下面是我的预期结果

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

我尝试使用 $elemMatch 但返回数组中的第一个匹配元素

我的查询:

db.test.find( { _id" : ObjectId("512e28984815cbfcb21646a7") }, { 
    list: { 
        $elemMatch: 
            { a: { $gt:3 } 
            } 
    } 
} )

结果返回数组中的一个元素

{ "_id" : ObjectId("512e28984815cbfcb21646a7"), "list" : [ { "a" : 4 } ] }

我尝试将聚合与 $match 一起使用,但不起作用

db.test.aggregate({$match:{_id:ObjectId("512e28984815cbfcb21646a7"), 'list.a':{$gte:5}  }})

返回数组中的所有元素

{
    "_id" : ObjectId("512e28984815cbfcb21646a7"),
    "list" : [
        {
            "a" : 1
        },
        {
            "a" : 2
        },
        {
            "a" : 3
        },
        {
            "a" : 4
        },
        {
            "a" : 5
        }
    ]
}

我可以过滤数组中的元素以获得预期结果吗?

最佳答案

使用 aggregate 是正确的方法,但在应用 $match 以便您可以过滤单个元素,然后使用 $group 将其重新组合在一起:

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

输出:

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

MongoDB 3.2 更新

从 3.2 版本开始,您可以使用新的 $filter聚合运算符通过在 $project 期间仅包含所需的 list 元素来更有效地执行此操作:

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

https://stackoverflow.com/questions/15117030/

相关文章:

node.js - 编译 Mongoose 后无法覆盖模型

MongoDB - 分页

node.js - 在 Mongoose 中将两个 OR 查询与 AND 组合

mongodb - 面向列的 NoSQL 与面向文档的 NoSQL 有何不同?

mongodb - 溢出排序阶段缓冲数据使用量超过内部限制

python - 插入后如何更新 Mongo 文档?

mongodb - 使用 Mongoose 从 MongoDB 文档中删除一个键

javascript - Mongoose:获取完整的用户列表

database-design - MongoDB Schema Design - 许多小文档还是更

node.js - 如何保护 Mongoose/MongoDB 中的密码字段,以便在填充集合时它不会