MongoDB更新子文档属性

时间:2014-08-04 14:01:30

标签: mongodb subdocument

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

我有以下示例文档,其子文档为'地址':

{ 
    "_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.

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:2)

您的查询"addresses.end" : {"$exists" : false}中的Juste替换为:

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

答案 1 :(得分:0)

我认为查询应该更具体

**更新**

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

中的更多元素

答案 2 :(得分:0)

您的地址字段定义不明确。你需要使它成为子文档或子文档数组。即{     " _id" :ObjectId(" ....")     "地址" :         [            的 {             "开始" :ISODate(" 1973-07-10T00:11:51.111Z")             "值" :" 123漫长的道路"             的}         ] }

您的查询应该有效!