【问题标题】:add new item value into an embedded document in mongoDB将新项目值添加到 mongoDB 中的嵌入文档中
【发布时间】:2015-03-20 11:43:30
【问题描述】:

我有一份文件:

{
        "_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 documentUpdate or replace an embedded document in MongoDB collection

我尝试了一些奇怪的事情...但是....请帮助我正确查询

我还使用 C# 驱动程序尝试了这些 喜欢

WriteConcernResult res = booksColl.Update(query, Update.Set("testa.$.item1", "itemedited"),UpdateFlags.Upsert);

【问题讨论】:

  • 使用这种模式,在数组对象具有动态键的文档上执行写操作会有点困难。如果您足够灵活,我建议您更改架构以使 testa 数组包含具有以下结构的元素,例如[{"name": "item1", "value": "item1"}, {"name": "item2", "value": "item2"}] 然后您可以通过 db.books.update( { "author":"mno" }, { $addToSet: { "testa": {"name": "item3", "value": "item3"}} } ) 更新它
  • 谢谢。我实际上也在想同样的事情,但是我需要重新设计整个架构,所以......除了删除整个数组并重新插入它之外,没有办法做到这一点

标签: mongodb mongodb-query mongodb-.net-driver


【解决方案1】:

以下语句应该有效

db.books.update(
   { "author":"mno" },
   { $set: { "testa.0.item3" : "item3"} } 
)

您可以使用点符号来指定数组中的项目,然后您可以将新的item3 字段设置为您希望的任何值。您在上面的示例中几乎是正确的 - 您只需要指定 "testa.0.item3" 而不是 "testa.0"

不过,我同意@chridam 的上述评论,并且更改架构将使文档更易于使用。现在可能需要做一些额外的工作,但从长远来看,它会为您节省时间。

【讨论】:

  • 但这确实在 testa 数组中添加了一个项目,例如 testa:[{"item1":"item1","item2":"item2"},{item3:item3}]
  • 我已经在我的本地 mongo shell 中运行它并且它运行正常。 $set 命令的 testa.0.item3 值针对 testa 文档数组中放置的 0 文档的 item3 属性。在 $set 命令上使用 testa.1.item3 的值会给你上面提到的结果
【解决方案2】:

实际上你没有项目集合,你有一个文档集合,其中项目作为键:值,如果这是目标,更新可能是:

> 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"
                }
        ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2021-09-19
    • 1970-01-01
    相关资源
    最近更新 更多