1

内部のキーの名前を知らなくても、参加者のすべてのキーの値をインクリメントするのに助けが必要です。

> db.conversations.findOne()

{
"_id" : ObjectId("4faf74b238ba278704000000"),
"participants" : {
    "4f81eab338ba27c011000001" : NumberLong(2),
    "4f78497938ba27bf11000002" : NumberLong(2)
}
}

私は次のようなもので試しました

$mongodb->conversations->update(array('_id' => new \MongoId($objectId)), array('$inc' => array('participants' => 1)));

無駄に...

4

2 に答える 2

2

スキーマを再設計する必要があります。「ランダムなキー名」を持つことは決して良い考えではありません。MongoDB はスキーマレスですが、キー名を定義する必要があります。スキーマを次のように変更する必要があります。

{
    "_id" : ObjectId("4faf74b238ba278704000000"),
    "participants" : [
        { _id: "4f81eab338ba27c011000001", count: NumberLong(2) },
        { _id: "4f78497938ba27bf11000002", count: NumberLong(2) }
    ]
}

悲しいことに、それでも、埋め込まれたすべてのカウントを 1 つのコマンドで更新することはできません。現在、そのためのオープンな機能リクエストがあります: https://jira.mongodb.org/browse/SERVER-1243

すべてを更新するには、次のことを行う必要があります。

  • ドキュメントをクエリする
  • クライアント側のすべてのカウントを更新します
  • ドキュメントを再度保存する

それとの競合状態を防ぐために、「比較と交換」と次の段落を見てください。

于 2012-05-13T10:40:17.810 に答える
0

現在のバージョンの MongoDB では、ネストされたすべての要素を 1 回の移動で更新することはできません。したがって、「foreach {}」を使用することをお勧めします。

関連するトピックを読む: mongodbで複数の配列要素を更新する方法

この機能が次のバージョンで実装されることを願っています。

于 2012-05-13T17:50:52.650 に答える