#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