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

MongoDB:如何使用$where访问Schema中嵌套对象的值?

在MongoDB的$where中访问嵌套对象属性的正确方式

我来帮你搞定这个问题!你遇到的情况其实是用$where时访问嵌套属性的常见小问题,不过有两种办法可以解决,甚至还有更高效的替代方案:

方法一:修正$where函数的写法

首先,$where里的this确实指向文档本身,理论上直接访问this.refunds.minimumPrice是可行的,但如果你的集合里存在没有refunds字段的文档,直接访问会抛出错误,导致查询失败。所以我们先加个存在性检查再做比较:

Ticket.find({
  $where: function() {
    // 先确认refunds字段存在,避免因缺失字段报错
    return this.refunds && this.price <= this.refunds.minimumPrice;
  }
})

这样就能确保只有存在refunds字段的文档才会进入比较逻辑,不会因为字段缺失导致查询崩溃。

方法二:用$expr替代$where(更推荐)

说实话,$where的性能并不理想——它依赖JavaScript引擎执行,无法利用集合的索引,数据量大的时候查询速度会很慢。所以更推荐用MongoDB 3.6+支持的$expr操作符,直接用原生查询逻辑实现相同需求:

Ticket.find({
  $expr: {
    $lte: ["$price", "$refunds.minimumPrice"]
  }
})

这里的$price和$refunds.minimumPrice是文档的字段路径,$lte用来判断前者是否小于等于后者,既简洁又能利用索引,性能比$where好太多。

额外注意点

如果你的集合里有部分文档缺失refunds或refunds.minimumPrice字段,$expr会把这些缺失字段视为null,$lte比较时null和数值的结果是false,所以这类文档不会被匹配。如果想包含它们,可以补充条件:

Ticket.find({
  $or: [
    { $expr: { $lte: ["$price", "$refunds.minimumPrice"] } },
    { refunds: { $exists: false } },
    { "refunds.minimumPrice": { $exists: false } }
  ]
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:07:26