You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
  }
);
参考数据库结构截图
  • 数据库首页
  • grades字段展开页面
  • grades数组下标0字段详情页

内容的提问来源于stack exchange,提问作者Zeke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:48:06