12

次のようなオブジェクト構造があります。

 {
    name: "...",
    pockets: [
        {
            cdate: "....",
            items: [...]
        }
        ...
    ]
 }

更新操作で、最後のポケットアイテムのアイテムフィールドにいくつかのレコードを追加したいと考えています。サブドキュメントにアクセスする唯一の方法はドット表記を使用することですが、必要な情報が得られません。だから、私はこれらのようなものを探しています:

  • ポケット.-1.アイテム
  • pocket.$last.items

最後の要素を変更することは可能ですか? はいの場合、どのように?

4

2 に答える 2

3

アトミックにできるとは思えません。この機能を MongoDB に追加してほしいという要望があります。

アプリケーションコードでスレッド セーフを保証できる場合は、(ポケットから最後の要素を削除する) ポケット配列から一連の $pop を変数 p に使用し、次に $addToSet を p.items に使用できます。ポケットに戻します。ただし、一度に 1 つのプロセスのみがこれを実行することを保証する方法がアプリケーションにない場合、別のプロセスがこれらの手順の途中で配列を変更し、その更新が失われる可能性があります。

ここで「Update if current」セマンティクスを調べて、複数のスレッドの問題による競合の可能性を回避する別の方法を確認することもできます。

于 2012-05-22T19:43:51.693 に答える
3

I don't know of a way to do this using a single-line query. But you could select the record, update and then save it.

var query = <insert query here>;
var mydocs = db.mycollection.find(query);
for (var i=0 ; i<mydocs.length ; i++) {
    mydocs[i].pockets[pockets.length-1].items.push('new item');
    db.mycollection.save(mydoc);
}
于 2012-05-22T18:55:04.450 に答える