使用多个嵌套文档更新文档字段
Update a document field with multiple nested documents
我有一个现有的 MongoDB 文档,其中包含字段 files
(以及其他字段)。 files
字段是一个对象,现在我想用几个嵌套文档更新这个字段。我已成功插入一个嵌套文档,语法如下:
db.collection.updateOne(
{ "id": 1 },
{
$set: {
"files":
{
"filename1": {
"a": "Lorem ipsum dolor",
"b": "Sit amet consectetur",
"c": "Adipiscing elit"
}
}
}
})
接下来,我尝试将另外 2 个文档同时插入 file
字段,但失败了
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"
}
}
}})
在这不起作用之后,我尝试使用第一个代码块一个一个地插入记录,但插入 filename2
(我不想覆盖现有的 filename1
)。此文档已插入 files
对象,但覆盖了现有文档 filename1
。我尝试了几种不同的变体,但没有任何效果。
关于如何在一个字段中嵌套多个文档的任何 feedback/assistance 都会有所帮助。
它没有工作,因为您的更新查询几乎没有问题,检查一下:
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
使用 $set
回到 MongoDB,这是对 DB 的两次调用。在另一种方式中,你可以通过这个在一个数据库调用中完成它:
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"
}
}
}
我有一个现有的 MongoDB 文档,其中包含字段 files
(以及其他字段)。 files
字段是一个对象,现在我想用几个嵌套文档更新这个字段。我已成功插入一个嵌套文档,语法如下:
db.collection.updateOne(
{ "id": 1 },
{
$set: {
"files":
{
"filename1": {
"a": "Lorem ipsum dolor",
"b": "Sit amet consectetur",
"c": "Adipiscing elit"
}
}
}
})
接下来,我尝试将另外 2 个文档同时插入 file
字段,但失败了
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"
}
}
}})
在这不起作用之后,我尝试使用第一个代码块一个一个地插入记录,但插入 filename2
(我不想覆盖现有的 filename1
)。此文档已插入 files
对象,但覆盖了现有文档 filename1
。我尝试了几种不同的变体,但没有任何效果。
关于如何在一个字段中嵌套多个文档的任何 feedback/assistance 都会有所帮助。
它没有工作,因为您的更新查询几乎没有问题,检查一下:
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
使用 $set
回到 MongoDB,这是对 DB 的两次调用。在另一种方式中,你可以通过这个在一个数据库调用中完成它:
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"
}
}
}