MongoDB如何不使用聚合框架,仅用find()方法查询包含6月访问子文档的文档?
使用
db.find()查询包含6月视图记录的文档 当然可以!不用依赖聚合框架,单纯靠db.collection.find()就能轻松实现你要的查询需求,这里给你两种实用的方案:
方案一:基于日期范围精确匹配(推荐,支持索引)
如果你的需求是针对特定年份的6月(比如示例中的2015年),可以直接通过日期范围结合$elemMatch操作符来查询,这种方式能利用views.date字段的索引,查询效率更高:
db.yourCollection.find({ "views": { "$elemMatch": { "date": { "$gte": ISODate("2015-06-01T00:00:00.0Z"), "$lt": ISODate("2015-07-01T00:00:00.0Z") } } } })
原理说明:
$elemMatch会检查views数组中是否存在至少一个子文档满足date落在2015年6月1日到7月1日的区间内(注意用$lt而不是$lte,避免包含7月1日的零点记录)。- 只要数组中有一个元素符合条件,整个文档就会被返回。
方案二:匹配任意年份的6月(无索引依赖)
如果你想查询所有年份中包含6月视图记录的文档,不用固定年份,可以借助$expr结合聚合表达式来实现:
db.yourCollection.find({ "$expr": { "$anyElementTrue": { "$map": { "input": "$views", "as": "view", "in": { "$eq": [ { "$month": "$$view.date" }, 6 ] } } } } })
原理说明:
$map遍历views数组的每个元素,对每个date字段用$month提取月份,再和数字6比较,生成一个布尔值数组(每个元素表示对应视图是否在6月)。$anyElementTrue检查这个布尔数组中是否存在至少一个true,如果存在则匹配该文档。- 注意:这种方式无法利用索引,当集合数据量较大时,性能会比方案一差一些。
内容的提问来源于stack exchange,提问作者DanielZ
相关产品推荐
相关产品推荐

