MongoDB使用$max操作符更新数组字段的比较规则疑问
MongoDB $max 数组比较逻辑说明
首先你混淆了两种不同场景下的数组比较规则,这是问题的核心:
- 普通BSON值大小比较(
$max、$gt、$lt等值判断运算符使用):采用逐元素按索引顺序比较逻辑,规则如下:- 从索引为0的第一个元素开始对比,若当前索引的元素可以分出大小,直接判定整个数组的大小,后续所有元素不再参与比较
- 若当前索引元素相等,继续对比下一个索引的元素
- 若两个数组所有共同索引的元素全部相等,长度更长的数组判定为更大
- 数组字段参与
sort排序时的特殊规则:就是你查到的官方文档说明,升序排序比较数组最小元素,降序排序比较数组最大元素,该规则仅适用于排序场景,不适用于$max这类值比较场景
结合你的案例推演
- 现有文档的
arrayField值:[128, 190, 1] - 传入
$max的待比较新数组:[1, 190, 1879] - 逐元素比较过程:
第一步对比索引0的元素,128 > 1,直接得出「现有数组 > 新数组」的结论,后续的190、1879等元素完全不参与比较 $max仅在新值大于旧值时才会更新字段,因此本次更新modifiedCount为0,和你拿到的输出结果一致。
验证参考
你可以自行执行以下更新命令验证逻辑:
- 传入新数组
[129, 0, 0]:第一个元素129>128,会触发更新 - 传入新数组
[128, 191, 0]:第一个元素相等,第二个元素191>190,会触发更新 - 传入新数组
[128, 190, 1, 2]:前三个元素完全相等,新数组长度更长,会触发更新
内容的提问来源于stack exchange,提问作者rekotc
相关产品推荐
相关产品推荐

