Как получить возвращаемое значение функции findAndModify в MongoDB с помощью mongoose? - PullRequest
7 голосов
/ 19 марта 2012

Я использую Node.js + mongoose + MongoDB следующим образом:

SomeModelSchema.statics.findAndModify = function (query, sort, doc, options, callback) {
    return this.collection.findAndModify(query, sort, doc, options, callback);
};

SomeModel.findAndModify({}, [], { $inc: { amount: 1 } }, {}, function (err) {
    if (err) throw err;
});

Я могу успешно увеличить amount, но я хочу получить новое значение amount без повторного выполнения запроса. Есть ли способ сделать это?

Ответы [ 2 ]

8 голосов
/ 19 марта 2012

Укажите {new:true} в объекте options.Это приведет к тому, что результирующее значение findAndModify станет документом после применения обновления, которое можно затем прочитать, чтобы получить новое значение amount.

Подробности здесь, в таблице: http://www.mongodb.org/display/DOCS/findAndModify+Command

Я полагаю, что вашему обратному вызову нужно будет принять два аргумента, например: function(err, result){

Когда обратный вызов запущен, result должен содержать новый документ (если errнуль).

2 голосов
/ 24 марта 2015

Я проверил исходный код монаха и, наконец, сделал это работающим. Даже кодовая документация говорит, как это должно быть, но это не видно из документации в сети монаха.

/**
 * findAndModify
 *
 * @param {Object} search query, or { query, update } object
 * @param {Object} optional, update object
 * @param {Object|String|Array} optional, options or fields
 * @param {Function} callback
 * @return {Promise}
 * @api public
 */

Это означает, что вы можете указать запрос и обновление в качестве отдельных параметров, плюс опции в качестве третьего параметра:

notescollection.findAndModify(
  { "_id": id },
  { "$set": { 
      "title": title,
      "content": content
  }},
  { "new": true, "upsert": true },
  function(err,doc) {
    if (err) throw err;
    console.log( doc );
  }
);

Или вы можете указать запрос и update в качестве полей первого параметра, плюс options в качестве второго параметра:

notescollection.findAndModify(
  {
    "query": { "_id": id },
    "update": { "$set": { 
        "title": title,
        "content": content
    }}
  },
  { "new": true, "upsert": true },
  function(err,doc) {
    if (err) throw err;
    console.log( doc );
  }
);

Для получения дополнительной информации об источниках, проверьте функцию findAndModify в файле collection.js.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...