2015-10-27 2 views
0

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, что я хочу «массив», чтобы быть типом массива, со следующими ограничениями:

  1. Я хочу, чтобы выполнить это в одном запросе, не глядя на запись первого ,
  2. Я хочу, чтобы сохранить все существующие записи массива и объект значения

Короче говоря, я хочу поведение $set: {"array.0.value": ... } если «массив» уже инициализирован как массив, не зная, есть ли он или нет. Это возможно?

+0

Вы видели https://docs.mongodb.org/manual/reference/operator/update-array/? – avrono

+0

Или из документации 'db.products.update ( {_id: 100}, {$ набора: { Количества: 500, детали: {модели: "14Q3", сделать: "А"}, тегов : [«пальто», «верхняя одежда», «одежда»] } }) 'so $ set {arrayname: [" value1 "," value2 "....]} – avrono

+0

Да @avrono, я видел те. Как я уже сказал в вопросе, я хочу установить только одно значение для существующего члена массива (или добавить член массива, если он еще не существует), не сбивая другие записи массива. Операторы обновления массива, с которыми вы связались, не делают этого, и не предлагает синтаксис, который вы предлагаете (что также касается моего вопроса, если вы его читаете :)). – user85461

ответ

1

Я не уверен, что это возможно без поиска. Возможно, вы можете изменить дизайн схемы, и попробовать что-то вроде этого:

db.test.insert({_id: "one"}); 
db.test.update({_id: "one"}, {$addToSet: {array: { $each:['cheese', 'ham'] }}}); 
db.test.findOne({_id:'one'}); 
// { "_id" : "one", "array" : [ "cheese", "ham" ] } 

элементы Обработка массива (суб-документов в массиве) в MongoDb боль. https://jira.mongodb.org/browse/SERVER-1243

Смежные вопросы