MongoDB интерпретирует $set
пути с числовыми компонентами как ключи объектов, а не индексы массивов, если это поле еще не было создано как массив.
> db.test.insert({_id: "one"});
> db.test.update({_id: "one"}, {$set: {"array.0.value": "cheese"}});
> db.find({_id: "one"})
{ "_id": "one", "array": { "0" : { "value" : "cheese" } }
Я ожидал получить "array": [{"value": "cheese"}]
, но вместо этого он был инициализирован как объект с ключом со строкой «0».
я мог бы получить массив инициализации всего массива, например, так:
> db.test.update({_id: "one"}, {$set: {"array": [{"value": "cheese"}]}});
... но это будет затирать все существующие свойства и другие элементы массива, которые могут быть предварительно установлены.
Есть ли способ, чтобы убедить $set
, что я хочу «массив», чтобы быть типом массива, со следующими ограничениями:
- Я хочу, чтобы выполнить это в одном запросе, не глядя на запись первого ,
- Я хочу, чтобы сохранить все существующие записи массива и объект значения
Короче говоря, я хочу поведение $set: {"array.0.value": ... }
если «массив» уже инициализирован как массив, не зная, есть ли он или нет. Это возможно?
Вы видели https://docs.mongodb.org/manual/reference/operator/update-array/? – avrono
Или из документации 'db.products.update ( {_id: 100}, {$ набора: { Количества: 500, детали: {модели: "14Q3", сделать: "А"}, тегов : [«пальто», «верхняя одежда», «одежда»] } }) 'so $ set {arrayname: [" value1 "," value2 "....]} – avrono
Да @avrono, я видел те. Как я уже сказал в вопросе, я хочу установить только одно значение для существующего члена массива (или добавить член массива, если он еще не существует), не сбивая другие записи массива. Операторы обновления массива, с которыми вы связались, не делают этого, и не предлагает синтаксис, который вы предлагаете (что также касается моего вопроса, если вы его читаете :)). – user85461