21

私はmongodbコンソールでこれを試しています:

db.foobar.update( 
  { name: "Foobar" },
  { 
    $set : { foo: { bar: 'bar' }, 
    $inc: { 'foo.count': 1 } 
  } 
}, true)

「ok」で戻りますがdb.foobar.find()、は空のレコードセットを返します。ドキュメントを作成しようとしてupsertいるので、次のようになります。

name: Foobar
foo: {
  bar: 'bar'
  count: 1
}

ドキュメントが存在しない場合は、カウントが1のドキュメントを作成します。それ以外の場合は、カウントを増やします。なぜ上記が機能しないのですか?

4

3 に答える 3

28

あなたのコードは、foo.countフィールドで$ inc修飾子を使用するのではなく、実際にドキュメントの$incフィールドを設定しようとしているように見えます。これはあなたが望むものかもしれません:

db.foobar.update(
    { name: "Foobar" }, 
    {
        $set: { 'foo.bar': 'bar' }, 
        $inc: { 'foo.count': 1 } 
    }, true)

お役に立てれば。

于 2012-05-27T15:51:01.120 に答える
2

提供したコードスニペットでは、$setオブジェクトの後に閉じ中括弧がありません。しかし、それは副次的な問題です。

1回のトランザクションで同じサブドキュメントを設定およびインクリメントできるとは思いません。countはfooの下のメンバーであるため、アップサートではまだ存在しません。次のことを試してみると、エラーが発生します。

db.foobar.update( 
   { name: "Foobar" },
   { 
     $set : { foo: { bar: 'bar' }}, 
     $inc: { 'foo.count': 1 } 
   } 
}, true)

「アップデートでの競合するMOD」です。多分あなたはそれをこのようにモデル化することができます:

db.foobar.update({name:"foobar"},{$set:{foo:{bar:"bar"}},$inc:{count:1}},true);

または必要に応じて:

db.foobar.update({name:"foobar"},{$set:{foo:{bar:"bar"}},$inc:{"counts.foo":1}},true);
于 2012-05-27T19:55:08.420 に答える
0

だから私は現在試しています:

var doc = {
            "name": "thename",
            "organisation": "theorganisation"
        }, // document to update. Note: the doc here matches the existing array
    query = { "email": "email@example" }; // query document
    query["history.name"] = doc.name; // create the update query
    query["history.organisation"] = doc.organisation;
    var update = db.getCollection('users').findAndModify({
        "query": query,
        "update": { 
            "$set": { 
                "history.$.name": doc.name,
                "history.$.organisation": doc.organisation
            },
            "$inc": { "history.$.score": 5 } //increment score
        }
    });
    if (!update) {
        db.getCollection('users').update(
            { "email": query.email },
            { "$push": { "history": doc } }
        );
    }
    db.getCollection('users').find({ "email": "email@example" });

これにより、が更新scoreされ、存在しない場合はオブジェクトに追加されますが、すべてのオブジェクトnameがdoc.name(この場合は「thename」)に変更されているようです。

ドキュメントがまだ存在しない場合、私は乗り込んでいません

于 2016-06-14T19:37:15.813 に答える