обновление документа с помощью оператора $max для массивов

#arrays #mongodb

#массивы #mongodb

Вопрос:

у меня есть следующий документ:

  {
    _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. Они оба являются массивами, поэтому для каждого элемента должно быть какое-то сравнение, но как именно это работает?

Из документации, которую я прочитал, это:

При использовании массивов сравнение с меньшим или сортировка по возрастанию сравнивает наименьший элемент массивов, а сравнение с большим или сортировка по убыванию сравнивает наибольший элемент массивов. Таким образом, при сравнении поля, значением которого является одноэлементный массив (например, 1 ), с полями, не являющимися массивом (например, 2), сравнение находится между 1 и 2. Сравнение пустого массива (например, [ ] ) рассматривает пустой массив как меньший, чем null или отсутствующее поле.

Но я все еще точно не понимаю… Может ли кто-нибудь привести пример в моем случае? Заранее спасибо

Комментарии:

1. Каков ваш ожидаемый результат?

2. Проблема здесь в том, что я не понимаю, как работает сравнение. Выполняется ли сравнение для каждого отдельного элемента массива? Переставлены ли элементы перед сравнением? Я могу легко сказать, что 1879 больше, чем 190, но как 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 =
 

Для оператора update $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 запросов.
Совокупные файлы с одинаковыми именами являются строгими и так не работают.

* Это не похоже на полное, потому что у нас много типов, я думаю, что все вышеперечисленное в порядке, ответ может помочь, он был большим, чтобы поместиться в комментариях.

Комментарии:

1. Большое вам спасибо за подробный ответ, но я все еще не понимаю этого в моем случае. Первый массив в моем примере — [128, 190, 1], а второй — [1,190,1879]. max (128,190,1) = 190, а max(1,190,1879) = 1879. Таким образом, обновление должно изменить документ, поскольку предоставленный массив> чем тот, который уже есть в документе. Что я упускаю из виду?

2. вы не просто отсутствуете, я тоже отсутствовал, я тестировал сейчас, я думаю $max , что он берет элементы один за другим и сравнивает их. Я думаю, что эти правила применяются $max только к разным типам данных. прошу прощения за путаницу. Я думаю, что вышесказанное работает, но не для $max