MongoDB查询嵌套数组字段 筛选grades日期的正确写法
问题根因
- 原查询直接将ISODate类型的
date字段与整数2013做大小比较,类型不匹配导致日期筛选失效。库中存储的日期是标准ISO时间对应的日期对象,必须使用日期类型构造阈值才能正确比较。 - 原查询投影部分存在冗余:同时指定
grades:1和grades.grade:1无实际意义,若需要返回评分和对应日期,明确指定grades.grade、grades.date即可。
正确实现
如果你的需求是前3次评分均为A,且第一次评分时间在2012年之后,使用以下查询:
db.restaurants.find( { 'grades.0.grade': 'A', 'grades.1.grade': 'A', 'grades.2.grade': 'A', // 2012年之后的时间阈值设为2013年1月0点的UTC时间 'grades.0.date': { $gt: ISODate('2013-01-01T00:00:00.000Z') } }, { borough: 1, cuisine: 1, name: 1, 'grades.grade': 1, 'grades.date': 1 } );
注:如果运行环境不支持
ISODate()构造函数,可以替换为new Date('2013-01-01'),二者生成的日期阈值完全一致。
如果你的需求是所有评分记录均为A、且评分时间在2012年之后,使用$elemMatch匹配数组元素:
db.restaurants.find( { grades: { $not: { $elemMatch: { $or: [ { grade: { $ne: 'A' } }, { date: { $lte: ISODate('2013-01-01T00:00:00.000Z') } } ] } } } }, { borough: 1, cuisine: 1, name: 1, 'grades.grade': 1, 'grades.date': 1 } );
参考数据库结构截图
内容的提问来源于stack exchange,提问作者Zeke
相关产品推荐
相关产品推荐




