Ответ 1
Как и ожидалось, запрос легко, как только вы знаете, как это сделать. Здесь синтаксис в python:
db["my_collection"].update(
{ "_id": ObjectId(document_id) },
{ "$set": { 'documents.'+str(doc_index)+'.content' : new_content_B}}
)
Я пытаюсь обновить один подэлемент, содержащийся в массиве в документе 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.
Как и ожидалось, запрос легко, как только вы знаете, как это сделать. Здесь синтаксис в python:
db["my_collection"].update(
{ "_id": ObjectId(document_id) },
{ "$set": { 'documents.'+str(doc_index)+'.content' : new_content_B}}
)
Обновление элемента массива, на которое ссылается индекс (например, 1) в Mongo Shell, также может быть выполнено путем прямого указания значения индекса:
db.my_collection.update(
{_id : "document_id"},
{$set : {"my_array.1.content" : "New content B"}}
)
В стиле монго, используя позиционный оператор $. Проверьте эту ссылку для деталей.
db.my_collection.update(
{_id: ObjectId(document_id), my_array.1 : 1 },
{ $set: { "my_array.$.content" : "NEW content B" } }
)
db.my_collection.update(
{_id: ObjectId(document_id), my_array : { ... old content A ... } },
{ $set: { "my_array.$.content" : "NEW content B" } }
)
Вы можете использовать функцию 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"}})
Хорошо, я ищу решение этой проблемы, и каждый найденный мной до сих пор ответ похож на "вы делаете array.2 или array.5 или array.anyotherpredefinedfixedvalue...", и я думаю, что это вообще не идеально, Я хочу сделать ARRAY.X... Я хочу изменить значение объекта внутри массива, в котором позиция X, а не 5 или 3 или любое другое фиксированное значение. Я не знаю никакой другой информации о массиве/объекте (он может быть пустым или может содержать некоторую информацию внутри). Я пытался все, и это сводит меня с ума прямо сейчас. Я не могу изменить 2 или 5 для переменной "x", она просто не работает. Может кто-нибудь объяснить, как я могу это сделать?