1

相同的查询适用于 mongodb 2.0.6。将其更新到 2.2.0 后会出现错误并且不执行操作。

"errmsg" : "exception: can't append to array using string field name [$]" 

这发生在以下行:

db.findAndModify(query, null, null, false, updateJob, true, false);

查询在哪里:

{ "_id" : ObjectID , "job" : { "$elemMatch" : { "jobId" : "1"}}}

并且updateJob是:

{ "$set" : { "job.**$**.endTime" : { "$date" : "2012-09-05T04:12:44.708Z"}}

** 我的测试集合如下,我想更新我的第一份工作并设置新的结束时间。

{
  "_id" : "5f6761d1-589a-4140-9753-5e890ab3ecb9", 

  "name" : "Test",

  "lastJobId" : 2,

  "job" : [{
      "jobId" : "1",

      "jobName" : "test1", 

      "endTime" : ISODate("2012-09-07T17:39:43.032Z"), 

    }, {
      "jobId" : "2",

      "jobName" : "test2", 

      "endTime" : ISODate("2012-09-07T17:39:43.838Z"),      
    }]
}

用于此的查询是:

{  findandmodify :  "Test", query : { _id : "5f6761d1-589a-4140-9753-5e890ab3ecb9", job : { $elemMatch : { jobId : "1" } } }, update : {  $set :  { job.$.endTime :  new  Date(1347039583032) } ,  new : true }
4

1 回答 1

0

您的查询:

{ "_id" : ObjectID , "job" : { "$elemMatch" : { "jobId" : "1"}}}

不需要使用“$elemMatch”。$elemMatch 专门用于您尝试匹配数组元素内的多个字段的情况。

由于您只有一个,因此您可以消除 $elemMatch 并仅使用 {"job.jobId":"1"} 作为查询过滤器以及 "_id" ,然后您的 findAndModify 将正常工作。

有一个错误会阻止 findAndModify 与 $elemMatch 和位置运算符更新在此处提交的 2.2 中正常工作。

于 2012-09-12T06:25:24.323 回答