Это не сработало, потому что в вашем запросе на обновление мало проблем, проверьте это:
db.collection.updateOne(
{ "id": 1 },
{
$set: {
"files":
{
"filename2": {
"d": "Lorem ipsum dolor",
"e": "Sit amet consectetur",
"f": "Adipiscing elit"
},
"filename3": {
"g": "Duis aute irure",
"h": "Labore et dolore",
"i": "Eiusmod tempor incididunt"
}
}
}
})
Вышеупомянутый запрос будет работать, но здесь есть проблема - он заменит существующее поле files
на отправляется новое files
, поскольку вы используете $set
, который заменит существующее поле новым значением (если старое значение отличается от нового значения).
Если files
- это массив, вы можете используйте $push
или $addToSet
для добавления новых значений в существующее поле files
(тогда вы просто замените $set
на одно из них, это будет работать), но если вы хотите, чтобы files
в качестве объекта, либо вам нужно прочитать его и ввести новые значения, используя нотацию .
в коде, и записать все files
обратно в MongoDB, используя $set
, то есть два вызова БД. Другим способом вы можете сделать это за один вызов БД следующим образом:
db.updateObject.updateOne({"id": 1}, {
$set: {
/** Same like programming language you use `.`,
You're not replacing files rather you're adding new objects to files,
If 'files.filename2' already exists in DB then it would be updated. */
'files.filename2': {
"d": "Lorem ipsum dolor",
"e": "Sit amet consectetur",
"f": "Adipiscing elit"
}, 'files.filename3': {
"g": "Duis aute irure",
"h": "Labore et dolore",
"i": "Eiusmod tempor incididunt"
}
}
})
, который обновит объект files
двумя новыми объектами в нем:
/* 1 */
{
"_id" : ObjectId("5e179dac627ef7823643cd97"),
"id" : 1,
"files" : {
"filename1" : {
"a" : "Lorem ipsum dolor",
"b" : "Sit amet consectetur",
"c" : "Adipiscing elit"
},
"filename2" : {
"d" : "Lorem ipsum dolor",
"e" : "Sit amet consectetur",
"f" : "Adipiscing elit"
},
"filename3" : {
"g" : "Duis aute irure",
"h" : "Labore et dolore",
"i" : "Eiusmod tempor incididunt"
}
}
}