MongoDB修改字段后如何查询?为何带$lte的timestamp查询无返回结果
MongoDB查询问题解答
问题1:字段修改后如何执行查询
分两种场景处理:
- 已对字段做持久化修改(即执行过
update类操作修改了文档存储的字段值):直接按修改后的字段值写普通查询条件即可,注意保证查询值和字段存储的类型一致即可。 - 查询时需要临时对字段做计算修改再做匹配:普通find查询默认直接匹配文档存储的原生字段值,无法直接处理计算后的值,可选用以下两种方案:
- 用
$expr运算符包裹逻辑,支持在查询条件内直接引用字段做计算后再判断匹配 - 使用聚合管道,先通过
$addFields/$set阶段计算得到修改后的字段值,再通过$match阶段做条件匹配
- 用
问题2:错误查询无返回结果的原因
你写的错误查询:
db.collection.find({"timestamp": {"$lte": ["$timestamp",new Date()] }})
不符合MongoDB普通查询的语法规则,触发了以下逻辑导致无结果:
- 普通查询的
{<字段>: {<比较运算符>: <匹配值>}}结构中,比较运算符后面的取值会被识别为常量匹配值,MongoDB不会解析里面的$timestamp这类字段引用语法,也不会将数组识别为两个需要比较的操作数。 - 该写法会被MongoDB解析为:查找
timestamp字段的值 小于等于["$timestamp", new Date()]这个数组本身 的文档,绝大多数场景下不会有符合该条件的文档,因此返回空。
你写的数组形式的$lte参数是$expr专属的表达式语法,如果要使用该写法需要用$expr包裹,如下所示,效果和你已知的正确写法完全等价:
db.collection.find({$expr: {"$lte": ["$timestamp",new Date()] }})
内容的提问来源于stack exchange,提问作者Dani Gilboa
相关产品推荐
相关产品推荐

