Ilya
Каким образом я могу получить только второй объект, у которого есть ребенок {"name": "Harry", "age": 20}
Я пробовал запрос db.items.find({"children.name": "Harry", "children.age": 20}), но он ищет данные параметры по отдельности в children, а не в одном документе ребенка
[
{
"children": [
{
"name": "Harry",
"age": 50
},
{
"name": "Dmitry",
"age": 20
}
]
},
{
"children": [
{
"name": "Harry",
"age": 20
}
]
}
]
Artem
[{
array: [ { iid: 10, x: 5} ]
},
{
array: [ { iid: 11, x: 15} ]
},
{
array: [ { iid: 12, x: 6} ]
}]
Может ли updateMany обновить каждый документ в зависимости от значения x соответствующего документа?
yopp
yopp
Да
Artem
yopp
Не уверен в чём будет профит по сравнению с bulkWrite
Artem
yopp
nvm, неверно прочитал ваше сообщение :)
yopp
Да, вам просто pipeline в update необходим
yopp
В пайплайне вы можете использовать значение поля × и делать над ним вычисления
yopp
Если вы хотите условно установить значение поля y = x * z, то в update выражении вы этого сделать не можете, а во внутри пайплайна сможете
Artem
понял
Artem
пасибо
Artem
сейчас заметил, что mongoplayground не умеет в updateMany. Знает кто песочницу получше?
yopp
В vscode есть экстеншен
Artem
Artem
?(
Nick
Artem
Nick
а погодь, это агрегация
Artem
Artem
или просто updateMany
Artem
условно, у меня у доков (1) есть массив других доков с полями Х и Y. надо добавить к полю доков (1) произведение числа с Х того дока в массиве, у которого Y = 10
yopp
Artem
вам нужен $map
Как?
Мне ведь нужно конкретный элемент массива выбрать
Гена
Можно ли использовать update со списокм обновлений?
скажем у меня есть массив [[1, 2], [2, 5], [3, 10]] и мне надо обновить поле в документах с айди 1,2,3 соответственно 2,5,10
Гена
то есть можно ли как то сформировать список обновлений со стороны языка и разом все обновить? чтоб не отсылать много запросов подряд
Google
Google
Передай массив id
Google
Google
Поможет тебе почитай
yopp
если вы знаете индекс элемента то через $field.<idx>.anotherField, например $field.12.anotherField
Artem
Artem
Но мне нужно не каждый изменить
Artem
[{
array: [ { iid: 10, x: 5} ]
},
{
array: [ { iid: 11, x: 15} ]
},
{
array: [ { iid: 12, x: 6} ]
}]
Artem
У каждого из этих документов есть field: 10
Artem
yopp
тогда вам нужен $reduce и $cond
yopp
и потом $map
Artem
Все в агрегации?
yopp
через $reduce вычисляете условие
yopp
в $cond проверяете выполнено ли условие
yopp
если выполнено делаете $map
Artem
Спасибо
yopp
если не выполнено то возвращаете массив как есть
yopp
{$cond: [ {$reduce: { … }, {$map: { … , in: { … $mul …}}, «$field»]}
Artem
Мне просто казалось, что аггрегарция создаёт новый массив, и она не может менять базу
yopp
https://docs.mongodb.com/manual/reference/operator/aggregation/set/#overwriting-an-existing-field
yopp
когда вы выполняете агрегации в контексте update, то вы можете изменять текущий документ
yopp
по этому там доступен только ограниченный набор шагов
Artem
Спасибо!
Artem
yopp
что вы имеете ввиду под «поверхностью»?
Artem
@PTem
Доброй ночи, в рамках внутренний активностей идет сравнение МонгоДБ c другой базой, наткнулся на выступление по бэкапу МонгоДБ в Яндекс.Облаке. Там была озвучена проблема флип байта в BSON при копирование oplog в стор для RPO.
Вопрос, есть где-то официальное описание данной проблемы или как правильно задать вопрос в гугл, чтоб привел к описанию данной проблемы для MongoDB?
yopp
[{
$reduce: {}
}]
Очень сложно без примера ваших данных понять где у вас проблемы :(
yopp
yopp
Т.е проблемы с целостностью в физических хранилищах действительно бывают, но о каких-то специфичных проблем именно с bson мне не попадалось
@PTem
yopp
yopp
надо аккуратнее задавать вопросы на митапах 😂
yopp
Это вопрос не к bson, это вопрос к тому как у облака обеспечивается проверка целостности данных до момента сохранения в lts
yopp
Частично целостность гарантируется на L6, так как в wire protocol есть crc32. У wiredtiger тоже есть механизм контрольных сумм (checksum=on можно увидеть в wt.creationString)
yopp
End-to-end механизма, к сожалению, в монге нет
yopp
Но это достаточно распространённая проблема, не так много баз данных которые на всём пути от клиента к сервер и обратно умеют работать с контрольной суммой
yopp
С этим в принципе есть проблема, так как мы не всегда оперируем целиком оригинальной записью и вопрос как проверять целостность проекции этой записи достаточно сложный
Egor
Дарова всем. Никто не страдал такое штукой: апгрейд с 3.0.х до актуальной версии?
yopp
Если вы можете остановить монгу на какое-то время, то быстрее всего вероятно будет сделать дамп, установить 4.4 и восстановить дамп.
Либо последовательно обновлять 3.0 - 3.2 - 3.4 - 3.6 - 4.0 - 4.2 - 4.4
yopp
https://docs.mongodb.com/v3.2/release-notes/3.2-upgrade/
Egor
yopp
Нет, bson forward compatible