如何在MongoDB中仅查询返回嵌入式文档数组的指定子集
MongoDB 嵌入式文档数组过滤解决方案
你之前使用find查询返回完整data数组的原因是:普通find的查询条件仅用于判断整个文档是否符合匹配规则,不会对文档内的数组字段做裁剪,只要数组中存在至少一个符合条件的元素,完整数组就会被返回。
你可以通过聚合管道结合$filter操作符实现需求,具体实现如下:
db.你的集合名.aggregate([ // 第一阶段:先筛选出符合条件的文档,减少后续计算量 { $match: { "_id": { $in: ["Stock1", "Stock3"] }, "data.date": { $gte: ISODate("2010-01-01T00:00:00.000Z"), $lte: ISODate("2020-01-01T00:00:00.000Z") } } }, // 第二阶段:过滤data数组,仅保留符合日期范围的元素 { $project: { "_id": 1, "data": { $filter: { input: "$data", as: "item", cond: { $and: [ { $gte: ["$$item.date", ISODate("2010-01-01T00:00:00.000Z")] }, { $lte: ["$$item.date", ISODate("2020-01-01T00:00:00.000Z")] } ] } } } } } ])
如果你的集合中date字段存储的是字符串类型而非ISODate类型,直接把代码中ISODate()包裹的部分替换为对应格式的字符串即可。
内容的提问来源于stack exchange,提问作者user142389358902
相关产品推荐
相关产品推荐

