This pageは、以前に取り出された(find)ドキュメントに到達し、それを更新するためにサブエレメント(配列)に問い合わせる更新を示します。私はまったく同じことをする必要があります。例えばコード:mongodb find更新セマンティクス
> t.find()
{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC",
"comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }
> t.update({'comments.by':'joe'}, {$inc:{'comments.$.votes':1}}, false, true)
のfind-続い・バイ・更新を管理するルールはどのようなものがあり、私は、ドキュメントで、このための説明を気づいていません。ドライバー経由でmongodbの使用にも同じことが適用されますか?関連するセマンティクスへのリンクが役立ちます。私はC++ドライバを使用しています。
編集:自己答え
2つのコマンドが1にロールバックすることができます(これは、この質問が提起曖昧さを除去する一つの方法である)、更新のクエリ部分は、配列を参照することができ、サブ要素には、$
シンボルが参照されます。私はあなたが更新操作のクエリ部分で1つのサブ要素のみを参照できると仮定します。次のように私の場合は、更新操作が見えます:
db.qrs.update ({ "_id" : ObjectId("4f1fa126adf93ab96cb6e848"), "urls.u_id" : 171 }, { "$inc" : { "urls.$.CC": 1} })
_id
正しく右の一意の行「素数」と、2番目のクエリ要素"urls.u_id" : 171
は、問題の行が右側のフィールドを持っていることを保証します。 urls.$.CC
次に、$inc
オペレーションを正しいアレイエントリにルーティングします。どんなのMongoDB DEVまたは原稿ライタ
へ
recomendationは、それらの潜在的な競合状態を持っている例を表示しません。原子的に実行可能な複数の操作を表示しないようにしてください。
@self回答です。例が2ステップ操作を示していると間違っています。それはしません。著者は、コレクション内の文書の構造を、単に更新例を示す前に、findで読者に提示しています。 –