2013-09-17 5 views
2

Я хотел бы знать, как обновить поле «значение» одного из элементов, идентифицируемых полем «имя» в массиве «array_of_stuff». Например, я хочу обновить значение для «name_of_thing_1» до «new_value_of_thing_1». Как это сделать ТОЛЬКО, используя второй параметр (т. Е. Параметр обновления) для команды обновления. Я повторно использую библиотеку классов, написанную внутри дома. У меня нет контроля над первым аргументом команды обновления (т. Е. Параметра запроса). Это возможно?Обновление значения элемента массива в MongoDB

{ 
"array_of_stuff": [ 
    { 
     "name": "name_of_thing_1", 
     "value": "value_of_thing_1",   
    }, 
    { 
     "name": "name_of_thing_2", 
     "value": "value_of_thing_2", 
    } 
] 
} 

Благодарим за помощь!

ответ

10

Вы можете обновить значение одного элемента в массиве (если вы знаете свой индекс), как это:

db.stuff.update(/* query ... */, {$set:{"arrayname.<index>":new_value}}) 

Если массив содержит документы, вы можете обновить конкретное поле документа в том, что индекс, как это:

db.stuff.update(/* query ... */, {$set:{"array_of_stuff.0.value":"new_value_of_thing_1"}}) 

// If you could use the query parameter and knew something 
// about the value in the array you wanted to change: 
db.stuff.update({"array_of_stuff.value":"value_of_thing_1"}, {$set:{"array_of_stuff.$.value":"new_value_of_thing_1"}}) 
1

Смотрите, если этот пример поможет вам:

db.bruno.insert({"array": [{"name": "Hello", "value": "World"}, {"name": "Joker", "value": "Batman"}]}) 

db.bruno.update({"array.name": "Hello"}, {$set: {"array.$.value": "Change"}}) 

db.bruno.find().pretty() 

выход:

db.bruno.find().pretty() 
{ 
    "_id" : ObjectId("52389faaafd72821e7b25a73"), 
    "array" : [ 
     { 
      "name" : "Hello", 
      "value" : "Change" 
     }, 
     { 
      "name" : "Joker", 
      "value" : "Batman" 
     } 
    ] 
} 
1

Я не думаю, что это возможно. Для того, чтобы обновить поле одного из элементов массива, вы должны использовать позиционный $ оператор, например:

update({'array_of_stuff.name':'name_of_thing_1'}, 
     { $set: {'array_of_stuff.$.value':'new_value_of_thing_1'}}) 

Но according to documentation: позиционные $ оператора действует в качестве заполнителя для первого элемента, который соответствует документу запроса, и поле массива должно отображаться как часть документа запроса.

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