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

** 私の Test コレクションは以下のとおりで、最初のジョブを更新して新しい endtime を設定したいと考えています。

{
  "_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 は、配列要素内の複数のフィールドを一致させようとしている場合に特に適しています。

1 つしかないため、$elemMatch を削除して、クエリ フィルターとして {"job.jobId":"1"} を "_id" と共に使用するだけで、findAndModify が正常に機能します。

$elemMatch を使用した findAndModify と位置演算子の更新が 2.2 で正しく機能しないというバグがあり、ここにファイルされています

于 2012-09-12T06:25:24.323 に答える