2017-02-25 6 views
1

内のオブジェクトに新しい項目を追加する:私は、新しい要素を追加したいのMongoDB>私はこのようになりますコレクション持つ配列

{ 
    _id: ..., 
    checkins: [ 
     { 
      id: ..., 
      createdAt: 1488052032, 
      ... 
     }, 
     { 
      id: ..., 
      createdAt: 1488052032, 
      ... 
     } 
    ] 
} 

IDcreatedAtcreatedと呼ばれます属性(チェックインの内側、オブジェクトの配列)。そして、私はこの新しい要素を持たないすべての要素に対してそれをしたいと思います。

オブジェクトに既に属性が含まれているかどうかを確認する方法を知っていますが、要素を追加する際に問題があります。私は以下のコードを使用していると私にエラーを返します:位置指定の演算子はクエリから必要な一致を見つけませんでした

db.profiles.updateMany(
    {}, 
    {$set: {"checkins.$.created": new Date(0)}} 
) 

私が間違っていることについてのアイデアはありますか?複数のアレイサブ文書の更新として

答えて

1

は(this postを確認してください)であるとして、あなたはcreatedフィールドなしで少なくとも一つのサブドキュメントに一致するすべての文書にマッチし、次に1によって更新されなければならないサブ文書を1を更新することができますことはできません。

db.profiles.find({ 
    "checkins": { 
     "$elemMatch": { "created": { "$exists": false } } 
    } 
}).forEach(function(doc) { 

    doc.checkins.filter(function(event) { 
     return !('created' in event) 
    }).forEach(function(event) { 

     db.profiles.update({ 
      "_id": doc._id, 
      "checkins": { 
       "$elemMatch": { "created": { "$exists": false } } 
      } 
     }, { 
      $set: { 
       "checkins.$.created": new Date(0) 
      } 
     }); 
    }); 
}); 

フィールドが存在するかどうかを確認するためにを使用して、elemMatchを使用することに注意してください。これにより、最初のエラーメッセージがupdateManyリクエストで修正されるはずです(ただし、最初のリクエストですべての配列要素が更新されることはありません)

関連する問題