Вопрос:

Mongodb не может использовать деталь (...) для прохождения элемента ({...: undefined})]

mongodb mongodb-query

4701 просмотра

2 ответа

1597 Репутация автора

После обновления до 3.0 драйвер Монго я получаю новую ошибку по запросу обновления. Для обновления, как это:

db.table.update({_id: .... } , {$set : { "tags.Tag1" : true }});

Я получаю

cannot use the part (tags of tags.Tag1) to traverse the element ({tags: null})]]

Проблема в том, что мой обновленный документ уже содержит значение по умолчанию для tags: null. Если я вручную удаляю его из документа, обновление начинает работать правильно. Это новое поведение для меня, и это происходит после обновления драйвера Монго со 2 до 3 (даже не самой базы данных).

Но теперь мне интересно теперь, как избежать этой ошибки. Конечно, я могу проверить, были ли уже определены «теги», и только потом сделать это $setдля элемента или всей карты. Но это означает, что 3 запроса против одного старого и других проблем, таких как атомарность.

Автор: Oleg Источник Размещён: 22.08.2016 08:24

Ответы (2)


4 плюса

76 Репутация автора

Хотя это старый пост, но я думаю, что вы ищете, $ позиционный оператор

Я предполагаю, что ваши "теги" это массив. Таким образом, приведенный выше пример может быть что-то вроде

db.table.update({_id: .... } , {$set : { "tags.$.Tag1" : true }});

Надеюсь, это поможет!

Автор: DanNut Размещён: 06.03.2017 12:55

1 плюс

335 Репутация автора

Да, это может быть обновлено ... Я решил аналогичную проблему

Решил это

db.table.updateById({_id: .... } , {$set : { "levelSpecificData.scale.uom": "feet"}});

5b1f566ed65c7dcc34aaa7d5 MongoError: cannot use the part (scale of levelSpecificData.scale.uom) to traverse the element ({scale: false})

где в моей коллекции ' levelSpecificData.scale ' был логический тип T / F

Я изменил тип значения по умолчанию levelSpecificData.scale на «{}» пустой объект ... Удивительно, но он работал нормально после изменения значений по умолчанию на объект, так как я хочу рассматривать масштаб как ссылку на объект, это решение было хорошо для него.

Автор: spacedev Размещён: 26.06.2018 10:16
Вопросы из категории :
32x32