Вопрос по mongodb – Что я делаю не так с $ set и $ inc в обновлении

13

Я пытаюсь это наконсоль mongodb:

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

Возвращается с "хорошо", ноdb.foobar.find(), возвращает пустой набор записей. Я пытаюсьupsert документ, так что это выглядит так:

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

Если документ не существует, то создайте его со счетом 1. В противном случае просто увеличьте его. Почему выше не работает?

Ваш Ответ

3   ответа
1

ной скобки после объекта $ set. Но это побочный вопрос.

Я не верю, что вы можете устанавливать и увеличивать один и тот же поддокумент за одну транзакцию. Так как count является членом foo, в upsert он еще не существует. Ошибка, которую я получаю, когда я пытаюсь сделать следующее:

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

"конфликтующие моды в обновлении". Может быть, вы можете смоделировать это так:

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);
16

что ваш код на самом деле пытается установить поле $ inc документа, а не использовать модификатор $ inc в поле foo.count. Это может быть то, что вы хотите:

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

Надеюсь это поможет.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededdb.foobar.update( { name: "Foobar" }, { $set: { foo: { bar: 'bar' } }, $inc: { 'foo.count': 1 } }, true)Error: User Rate Limit Exceeded Christian Fazzini
0

var doc = {
            "name": "thename",
            "organisation": "theorganisation"
        }, // document to update. Note: the doc here matches the existing array
    query = { "email": "[email protected]" }; // 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 protected]" });

Это обновляетscoreи добавляет его к объекту, если он не существует, однако кажется, что он изменяет все объектыnames до doc.name (то есть в этом случае "thename").

Я не получил, если документ еще не существует

Похожие вопросы