FindAndModify, возвращает массив объектов

Я пытаюсь изменить несколько документов с помощью findAndModify, а затем вернуть новые измененные документы. Мой запрос:

db.users.findAndModify({
  query: {
    _id: {
      $in: [
        ObjectId("54061f3c27afac4b44688c1d"),
        ObjectId("54061f3c27afac4b44688c1e")
      ]
    }
  },
  update: {
    $inc: {
      i: 1
    }
  },
  new: true
});

но может получить только один документ. Моя цель - изменить несколько документов и вернуть их все. Можно ли получить массив документов?


person monkeyUser    schedule 27.02.2015    source источник


Ответы (1)


Как поясняется на этой странице в документах, findAndModify "изменяет и возвращает один документ". Если вы хотите изменить несколько документов с помощью findAndModify, вам придется запустить его один раз для каждого документа. В оболочке mongo вы можете добиться этого с помощью JavaScript, например следующего:

var oids = [ObjectId("54061f3c27afac4b44688c1d"),
            ObjectId("54061f3c27afac4b44688c1e")];
docs = [];
for (var i in oids) {
    id = oids[i];
    doc = db.e.findAndModify({
        "query": { "_id": id },
        "update": { "$inc": { "i": 1 }},
        "new": true
    });
    docs.push(doc);
}
printjson(docs);

Другой вариант — запустить update, используя multi в качестве опции, а затем получить документы. Ваш код будет выглядеть примерно так:

db.users.update(
    { "_id": {
        "$in": [ObjectId("54061f3c27afac4b44688c1d"),
                ObjectId("54061f3c27afac4b44688c1e")]
        }
    },
    { "$inc": { "i": 1 }},
    { "multi": true }
);
db.users.find(
    { "_id": {
        "$in": [ObjectId("54061f3c27afac4b44688c1d"),
                ObjectId("54061f3c27afac4b44688c1e")]
        }
    }
);
person Juan Carlos Farah    schedule 27.02.2015