1

データベースに次のようなオブジェクトがあるとします。

{
    _id: <...>,
    arrayOfObjects: [
        {
            criteria: "one",
            value: 5
        },
        {
            criteria: "two",
            value: 5
        },
        {
            criteria: "three",
            value: 5
        },
        {
            criteria: "four",
            value: 5
        },

    ]
}

私がしたいのは、次のような更新を実行することです。

{
    $inc: {
        "arrayOfObjects.2.value" : -1
    }
}

ただし、特定の要素のみに影響を与える必要があります。たとえば、{$or: [{criteria: "one"}, {criteria: "three"}]} のように、オブジェクトのコピーが有効期限の前に期限切れになる可能性があるため、配列インデックスに頼ることはできません。 update が実行されます (オブジェクトを配列に挿入、削除、再配置できます)。

これをやってのけることは可能ですか?これを行う最適な方法は何でしょうか?

4

3 に答える 3

1

位置演算子は一致した最初の配列要素のみを識別するため、これを 2 つの別個updateのコマンドとして実行する必要があります。$

db.coll.update({_id: <...>, 'arrayOfObjects.criteria': 'one'},
    {'arrayOfObjects.$.value': {$inc: -1}})
db.coll.update({_id: <...>, 'arrayOfObjects.criteria': 'three'},
    {'arrayOfObjects.$.value': {$inc: -1}})
于 2012-11-09T20:46:00.550 に答える
0

このクエリを使用

{$or: [{arrayOfObjects.criteria: "one"}, {arrayOfObjects.criteria: "three"}]}

あなたの更新のために

編集:

これを試して

collectionName.update({arrayOfObjects.criteria: "one"}, {$inc: {"arrayOfObjects.$.value" : -1}}, false, true);

collectionName.update({arrayOfObjects.criteria: "three"}, {$inc: {"arrayOfObjects.$.value" : -1}}, false, true);

また、 mongodb の更新 に関する詳細については、このリンクを参照してください http://www.mongodb.org/display/DOCS/Updating#Updating-update%28%29

私の答えを編集しました。

@JohnnyHKは正しいです。2 つのクエリが必要です。私の悪い。遅くて疲れました:)

于 2012-11-09T19:45:38.243 に答える
0

私の意見では正しいので、Michaiのクエリを実行できない正確な理由はわかりません。だから私は私の答えを投稿しています。まず、1 つのクエリでこれを行うことはできません。はい、ばかげているように聞こえますが、これが問題です: https://jira.mongodb.org/browse/SERVER-1243

そこにこの問題を書いたり、賛成票を投じたりするのは良い考えであり、今後数か月で解決される可能性があります. しかし、2010年の投稿の作成時間から判断すると、私はそれを非常に疑っています:-(

したがって、これを行う方法のいくつかの回避策があります: まず第一に、複数のクエリを使用してこれを行うことができるよりも多くの基準がない場合:

db.coll.update({
  _id: <...>,
  'arrayOfObjects.criteria': 'Criteria 1'
}, {
  'arrayOfObjects.$.value': {
     $inc: -1
   }
})

異なる基準がある限り何度でもこれを行います。

ただし、条件が多すぎると、クエリが無駄になりすぎます。したがって、どのような場合でも 2 つのクエリでこれを行うことができます。

  1. 基準に基づいてオブジェクトを読み取ります。db.coll.find( {'arrayOfObjects.criteria' : { $in: ['one', 'three'] }})
  2. アプリケーションレベルで変更する
  3. モンゴに保存
于 2012-11-10T01:13:04.063 に答える