1

Mongomaticでアトミックな「$set」演算子を使用してMongoDBドキュメントを更新する方法を理解するのに非常に苦労しています。私が問題を抱えているのはMongoの基準/更新言語であり、Mongomaticではないと確信していますが、間違っていることが証明されることを望んでいます。

スタンドアロンの実行可能なスクリプトを使用した要点へのリンクは次のとおりです:https ://gist.github.com/3835672

私は次のようなドキュメントを作成することから始めています。

{"videos":[{"video_id":"video1"},{"video_id":"video2"}],"_id":{"$oid": "506ddd53a114604ce3000001"}}

Mongomaticを使用してインスタンス化されたモデルを使用して、そのドキュメントを取得できます。

video_group = VideoGroup.find_one('videos.video_id' => 'video1')

次に、次のようにして、「ビュー」フィールドを設定しようとしています。

video_group.update!({ 'videos.video_id' => 'video1' }, '$set' => { 'videos.$.views' => 123 })

ここでMongoが爆発し、次のエラーが発生します。

can't append to array using string field name [$]

私はこれがStackOverflowで非常に一般的な質問であることを知っています。問題は、位置演算子が一致しないことだと一般的に理解しています。しかし、何十もの回答を読んでも、このステートメントを適切に表現する方法を理解することはできません。

間違ったデータ構造から始めたばかりですか?

4

1 に答える 1

1

実際、それはモンゴム的な問題です。基盤となるmongorubyドライバーにオプション{:multi => true}を渡す必要があります。また、オプションのパラメーターの一部としてではなく、mongodbに送信される更新の特定の_idに基準を含める必要があります。モンゴマティックのバグのようです。これが私がそれを見つけるために使用したrubyデバッガーのトランスクリプトです:https ://gist.github.com/3836797

投稿したファイルに変更を加え、debugger行#41の前に行を追加し、行#42-44を次のように変更したことに注意してください。

video_group.update!({ 'videos.video_id' => 'video1', :multi => true }, '$set' => {
  'videos.$.views' => 123,
})
于 2012-10-04T22:13:17.000 に答える