Подтвердить что ты не робот

MongoDB: Как обновить один подэлемент в массиве, на который ссылается индекс внутри массива?

Я пытаюсь обновить один подэлемент, содержащийся в массиве в документе mongodb. Я хочу ссылаться на поле, используя его индекс массива (элементы в массиве не имеют никаких полей, которые я могу гарантировать, будут уникальными идентификаторами). Похоже, это должно быть легко сделать, но я не могу понять синтаксис.

Вот что я хочу сделать в псевдо-json.

До:

{
  _id : ...,
  other_stuff ... ,
  my_array : [
    { ... old content A ... },
    { ... old content B ... },
    { ... old content C ... }
  ]
}

После:

{
  _id : ...,
  other_stuff ... ,
  my_array : [
    { ... old content A ... },
    { ... NEW content B ... },
    { ... old content C ... }
  ]
}

Похоже, что запрос должен быть примерно таким:

//pseudocode
db.my_collection.update(
  {_id: ObjectId(document_id), my_array.1 : 1 },
  {my_array.$.content: NEW content B }
)

Но это не работает. Я слишком долго искал документы mongodb и пробовал разные варианты этого синтаксиса (например, используя $slice и т.д.). Я не могу найти ясного объяснения того, как выполнить этот вид обновления в MongoDB.

4b9b3361

Ответ 1

Как и ожидалось, запрос легко, как только вы знаете, как это сделать. Здесь синтаксис в python:

db["my_collection"].update(
    { "_id": ObjectId(document_id) },
    { "$set": { 'documents.'+str(doc_index)+'.content' : new_content_B}}
)

Ответ 2

Обновление элемента массива, на которое ссылается индекс (например, 1) в Mongo Shell, также может быть выполнено путем прямого указания значения индекса:

db.my_collection.update(
    {_id : "document_id"},
    {$set : {"my_array.1.content" : "New content B"}}
)

Ответ 3

В стиле монго, используя позиционный оператор $. Проверьте эту ссылку для деталей.

db.my_collection.update(
  {_id: ObjectId(document_id), my_array.1 : 1 },
  { $set: { "my_array.$.content" : "NEW content B" } }
)

Ответ 4

db.my_collection.update(
  {_id: ObjectId(document_id), my_array : { ... old content A ... } },
  { $set: { "my_array.$.content" : "NEW content B" } }
)

Ответ 5

Вы можете использовать функцию updateOne mongoDB, передавая индекс элемента в массиве, если ключом старого содержимого B является "значение" для примера:

[
...
"value" : "old content A"
"value" : "old content B"
"value" : "old content C"
...
]

команда должна быть такой:

db.collection.updateOne({"_id" : "...,"},{$set: {"my_array.1.value": "NEW content B"}})

Ответ 6

Хорошо, я ищу решение этой проблемы, и каждый найденный мной до сих пор ответ похож на "вы делаете array.2 или array.5 или array.anyotherpredefinedfixedvalue...", и я думаю, что это вообще не идеально, Я хочу сделать ARRAY.X... Я хочу изменить значение объекта внутри массива, в котором позиция X, а не 5 или 3 или любое другое фиксированное значение. Я не знаю никакой другой информации о массиве/объекте (он может быть пустым или может содержать некоторую информацию внутри). Я пытался все, и это сводит меня с ума прямо сейчас. Я не могу изменить 2 или 5 для переменной "x", она просто не работает. Может кто-нибудь объяснить, как я могу это сделать?