7

これは私のドキュメントの形式です:

{
    _id: some id,
    name: 'some name',
    versions: []
}

フィールドには、バージョンの使用回数を保持する場所versionsなどのオブジェクトを格納します。{v: '2.5', count: 5}count

次のことを行う最も簡単な方法は何ですか?

  1. versions存在しない場合は、配列内に新しいオブジェクトを挿入します
  2. 特定のバージョンがversions配列内に存在する場合、そのバージョンをインクリメントしますcount
4

1 に答える 1

11

あるべき最も単純な方法は、

db.collection.update({versions.v:'some_version'},{"$inc":{"versions.$.count":1}});

バージョンが存在する場合、これによりカウントが増加しますが、MongoDB のドキュメントにあるように、$演算子を upsert と混在させることはできないため、上記のクエリは{versions.v:'some_version'}失敗した場合に挿入されません。

位置演算子は、一致する配列要素を必要とするため、アップサートと組み合わせることはできません。更新の結果が挿入された場合、「$」は文字どおりフィールド名として使用されます。

Below are JIRA tickets for supporting upsert with $. You can vote and watch these issue.

Upsert with $-positional operator can create bad documents

Support $ positional operator with an upsert

于 2012-06-25T07:42:57.107 に答える