我有一份文件:
{
"_id" : ObjectId("550c00f81bcc15211016699b"),
"name" : "book3",
"author" : "mno",
"publisher" : "pub",
"testa" : [
{
"item1" : "item1",
"item2" : "item2"
}
]
}
我想要做的就是在testa中添加另一个项目,如:
{
"_id" : ObjectId("550c00f81bcc15211016699b"),
"name" : "book3",
"author" : "mno",
"publisher" : "pub",
"testa" : [
{
"item1" : "item1",
"item2" : "item2",
"item3 : "item3"
}
]
}
我尝试使用
db.books.update(
{ "author":"mno" },
{ $addToSet: { testa : {"item3":"item3"} } }
)
这给出了
{
"_id" : ObjectId("550c05261bcc15211016699c"),
"name" : "book3",
"author" : "mno",
"publisher" : "pub",
"testa" : [
{
"item1" : "item1",
"item2" : "item2"
},
{
"item3" : "item3"
}
]
}
我试过
db.books.update(
{ "author":"mno" , "testa.item1" : "item1"},
{ $set : {"testa.0" : {"item3":"item3"}}},
{upsert : true / false}
)
这给了
{
"_id" : ObjectId("550c05fa1bcc15211016699d"),
"name" : "book3",
"author" : "mno",
"publisher" : "pub",
"testa" : [
{
"item3" : "item3"
}
]
}
我做错了什么,我到处检查 Insert an embedded document to a new field in mongodb document 和 Update or replace an embedded document in MongoDB collection
我尝试过很奇怪的事情......但是......请帮我解决问题
我也尝试使用C#驱动程序 像
WriteConcernResult res = booksColl.Update(query, Update.Set("testa.$.item1", "itemedited"),UpdateFlags.Upsert);
答案 0 :(得分:1)
以下陈述应该有效
db.books.update(
{ "author":"mno" },
{ $set: { "testa.0.item3" : "item3"} }
)
您可以使用点表示法来指定数组中的项目,然后您可以将新的item3
字段设置为您想要的值。您在上面的示例中几乎没有使用它 - 您只需指定"testa.0.item3"
而不是"testa.0"
我同意@ chridam的上述评论,但更改架构会使文档更容易继续使用。现在可能会有一些额外的工作,但从长远来看它会为你节省时间。
答案 1 :(得分:0)
实际上你没有一个项目集合,你有一个文件集合,其中有项目作为键:值,如果这是目标,则更新可能是:
> db.books.update({ "author":"mno" },{$set: {"testa.0.item3":"item3"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.books.find().pretty()
{
"_id" : ObjectId("550c00f81bcc15211016699b"),
"name" : "book3",
"author" : "mno",
"publisher" : "pub",
"testa" : [
{
"item1" : "item1",
"item2" : "item2",
"item3" : "item3"
}
]
}