0

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

我有以下示例文档,其中包含“地址”的子文档:

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

谁能指出我正确的方向?

4

3 回答 3

2

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

addresses: {$elemMatch: {end: {$exists: false}}}
于 2014-08-04T14:19:48.680 回答
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

于 2014-08-04T14:16:39.260 回答
0

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

您的查询应该可以工作!

于 2014-08-04T14:20:45.660 回答