【问题标题】:MongoDB update a subdocument attributeMongoDB 更新子文档属性
【发布时间】:2014-09-27 00:51:00
【问题描述】:

首先让我说对不起,如果这个问题已经得到解答,但我无法在这个网站上找到其他问题来满足我的需要,更重要的是,工作。

我有下面的示例文档,子文档为“地址”:

{ 
    "_id" : ObjectId("....")
    ,"addresses" : 
        [{
            "start" : ISODate("1973-07-10T00:11:51.111Z")
            ,"value" : "123 long road"
        }] 
}

我需要做的是使用end 属性关闭现有地址记录,并使用新的startvalue 属性为新地址添加新行。最后,我需要再次执行此操作,因此代码需要更新不存在 end 的子文档记录。

下面的代码不起作用,但它是我能得到的:

db.sites.update(
      {"_id" : ObjectId("....")
        , "addresses.end" : {"$exists" : false}}
     ,{"$set": {"addresses.$.end" : "fdsa"}});

这给出了错误:

Cannot apply the positional operator without a corresponding query field containing an array.

谁能指出我正确的方向?

【问题讨论】:

    标签: mongodb subdocument


    【解决方案1】:

    我认为查询应该更具体

    **更新**

    db.sites.update ( {"_id" : ObjectId("...."), addresses: { "$elemMatch" : { end:{$exists : false}} } }, {"$set": {"addresses.$.end" : "fdsa"}});
    
    db.sites.find()
    

    结果:

    {
        "_id" : ObjectId("53df93da560b7815e1237934"),
        "addresses" : [ 
            {
                "start" : ISODate("1973-07-10T00:11:51.111Z"),
                "value" : "123 long road",
                "end" : "fdsa"
            }
        ]
    }
    

    但你只能更新一个

    看看http://docs.mongodb.org/manual/reference/operator/projection/positional/#proj.S

    您无法更新数组https://jira.mongodb.org/browse/SERVER-1243中的更多元素

    【讨论】:

    • 这不是 OP 所要求的:他想更新没有和“end”属性的元素。
    【解决方案2】:

    只需将查询中的 "addresses.end" : {"$exists" : false} 替换为:

    addresses: {$elemMatch: {end: {$exists: false}}}
    

    【讨论】:

    • 太棒了,你们中的很多人。非常感谢:)
    • 伙计们,似乎将addresses.$.end 与$elemMatch 结合使用只会更新第一个子文档,而不是缺少end 属性的那个。任何想法如何始终更新没有 end 属性的子文档?
    • 它对我有用。它会更新缺少end 属性的第一个子文档...您确定没有多个缺少end 属性的子文档吗?
    • 得到它的工作也,我有另一个从来没有真正的条件。再次感谢。
    【解决方案3】:

    您的地址字段定义不明确。您需要将其设为子文档或子文档数组。 IE { "_id" : ObjectId("....") “地址”: [ { “开始”:ISODate(“1973-07-10T00:11:51.111Z”) ,"value" : "123 长路" } ] }

    然后您的查询应该可以工作了!

    【讨论】:

    • 抱歉,我错过了卷发{} - 它们确实存在,只是隐藏在我上面的帖子中。我会进行编辑。
    • @Barno 是否有解决方法进行多次更新?
    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 2015-11-08
    • 2015-08-15
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多