【问题标题】:updating a document using the $max operator on arrays使用数组上的 $max 运算符更新文档
【发布时间】:2022-01-11 04:23:51
【问题描述】:

我有以下文件:

 {
    _id: 12,
    item: 'envelope',
    qty: ISODate("2021-12-05T00:00:00.000Z"),
    arrayField: [ 128, 190, 1 ]
  }

我尝试使用此命令对其进行更新

products> db.products.update({_id:12},{$max : { arrayField : [1,190,1879]} })

输出如下:

{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 0,
  upsertedCount: 0
}

我不太明白现有的arrayField 和新的arrayField 之间的比较是如何进行的。它们都是数组,所以应该对每个元素进行某种比较,但它究竟是如何工作的呢?

documentation 我读到这个:

对于数组,小于比较或升序比较数组的最小元素,大于比较或降序比较数组的最大元素。因此,在将值为单元素数组的字段(例如 1 )与非数组字段(例如 2)进行比较时,比较在 1 和 2 之间。空数组的比较(例如 [ ])将空数组视为小于 null 或缺少字段。

但我仍然不完全理解......有人可以提供我的例子吗? 提前致谢

【问题讨论】:

  • 您的预期结果是什么?
  • 这里的问题是我不明白比较是如何工作的。是否对数组的每个元素进行比较?在比较之前元素是否重新排列?我可以很容易地说 1879 大于 190,但是 mongodb 是如何考虑这些信息的呢?我希望它对我的问题有所帮助...

标签: arrays mongodb


【解决方案1】:

MongoDB 采用最小值或最大值来表示比较中的数组,用于查询运算符。

数字

{"ar" : [1,2,3]}

(<= ar 1) => (<= min(1,2,3) 3) => (<= 1 3)  true
(>= ar 3) => (>= max(1,2,3) 3) => (<= 3 3) true

(= ar 2)  => true because it contains the element

For empty arrays either < or > its always false compared to a number

数组 (再次取最小值,如果 )

{"ar" : [1,2,3]}

(<= ar [0 1 2 3]) false because its like min(ar)=1 <min(0,1,2,3)=0

(= ar [1]) false we need all elements =

对于更新 $max 运算符

if both are arrays => elements are compared one by one.

max [1 2 3] [5] => [5]
max [1 2] [1 2 -100] => [1 2 -100]

这些仅适用于 $gte,$gt,$lt,$lte, $eq 查询 运算符。
同名的聚合是严格的,不能这样工作。

*它不完整,因为我们有很多类型,我认为以上还可以,答案可能会有所帮助,它很大,适合 cmets。

【讨论】:

  • 非常感谢您的详细回答,但在我的情况下我仍然不明白。我的示例中的第一个数组是 [128, 190, 1],第二个是 [1,190,1879]。 max (128,190,1) = 190, max(1,190,1879) = 1879。因此更新应该修改文档,因为提供的数组大于文档中已有的数组。我错过了什么?
  • 你不只是丢失,我也丢失了,我现在测试了,我认为$max 它会一个一个地获取元素,并比较它们。只有当我认为不同的数据类型时,这些规则才适用于$max。我很抱歉造成混乱。以上我认为是有效的,但不适用于$max
猜你喜欢
  • 1970-01-01
  • 2017-04-09
  • 2019-09-24
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 2022-12-05
  • 2016-07-12
相关资源
最近更新 更多