У меня есть документ, в MongoDB с 2 уровня глубокого вложенного массива объектов, которые мне нужно обновить, что-то вроде этого:Обновление вложенные массивы в MongoDB
{
id: 1,
items: [
{
id: 2,
blocks: [
{
id: 3
txt: 'hello'
}
]
}
]
}
Если есть только один глубокий массив уровня я мог бы использовать позиционный оператор обновить объекты в нем, но на второй уровень единственным вариантом я придумал, чтобы использовать позиционный оператор с индексом вложенного объекта, например:
db.objects.update({'items.id': 2}, {'$set': {'items.$.blocks.0.txt': 'hi'}})
этого подход работает, но мне кажется опасным для меня, так как я Создание веб-службы и индексный номер должны поступать из кли nt, который может отправить 100000 как индекс, и это заставит mongodb создать массив с 100000 индексами с нулевым значением.
Есть ли какие-либо другие способы обновления таких вложенных объектов, где я могу ссылаться на идентификатор объекта вместо его положения или, возможно, на способы проверки того, был ли предоставленный индекс за пределами, прежде чем использовать его в запросе?
Я предлагаю вам пересмотреть эту схему и найти другой дизайн, чтобы вы могли использовать мощность, предоставляемую MongoDB. Не будет простого/суперэффективного способа обновления определенного элемента в массиве AFAIK. Можете ли вы переконфигурировать это, чтобы вы могли воспользоваться преимуществами addToSet, 'pop' и других операторов массива? – brianz
Спасибо за предложение, да, я могу и на самом деле уже это сделал. Задав этот вопрос, я просто хотел быть уверенным, что ничего не пропустил. – Anton
Я также сталкиваюсь с той же проблемой. Можете ли вы опубликовать образец измененной схемы? – Damodaran