Mongoose是否支持Mongodb`findAndModify`方法?

Mongoose是否支持Mongodb`findAndModify`方法?,mongodb,mongoose,Mongodb,Mongoose,我想使用findAndModify,使用Mongoose,以原子方式递增字段 但是,下面的代码抛出错误“TypeError:Object”没有方法“findAndModify”: 我建议使用本部分底部显示的直接命令样式。我对mongoose不够熟悉,不知道运行命令的方法,但所有驱动程序都提供了一些方法。如果mongoose没有这样做,您可以直接使用在顶部描述的样式来完成 这就是说,您应该确保确实需要find和modify,并且update不会执行您需要它执行的操作。要查看update能够看到什么

我想使用findAndModify,使用Mongoose,以原子方式递增字段

但是,下面的代码抛出错误“TypeError:Object”没有方法“findAndModify”:


我建议使用本部分底部显示的直接命令样式。我对mongoose不够熟悉,不知道运行命令的方法,但所有驱动程序都提供了一些方法。如果mongoose没有这样做,您可以直接使用在顶部描述的样式来完成

这就是说,您应该确保确实需要
find和modify
,并且
update
不会执行您需要它执行的操作。要查看
update
能够看到什么。

该功能没有很好的文档记录(阅读:完全没有),但是在阅读了源代码之后,我提出了以下解决方案

创建您的收藏模式。

var Counters = new Schema({
  _id: String,
  next: Number     
});
Counters.statics.findAndModify = function (query, sort, doc, options, callback) {
  return this.collection.findAndModify(query, sort, doc, options, callback);
};
var Counter = mongoose.model('counters', Counters);
在架构上创建一个静态方法,该方法将公开模型集合的findAndModify方法。

var Counters = new Schema({
  _id: String,
  next: Number     
});
Counters.statics.findAndModify = function (query, sort, doc, options, callback) {
  return this.collection.findAndModify(query, sort, doc, options, callback);
};
var Counter = mongoose.model('counters', Counters);
创建您的模型。

var Counters = new Schema({
  _id: String,
  next: Number     
});
Counters.statics.findAndModify = function (query, sort, doc, options, callback) {
  return this.collection.findAndModify(query, sort, doc, options, callback);
};
var Counter = mongoose.model('counters', Counters);
查找并修改

Counter.findAndModify({ _id: 'messagetransaction' }, [], { $inc: { next: 1 } }, {}, function (err, counter) {
  if (err) throw err;
  console.log('updated, counter is ' + counter.next);
});
奖金

Counters.statics.increment = function (counter, callback) {
  return this.collection.findAndModify({ _id: counter }, [], { $inc: { next: 1 } }, callback);
};

Counter.increment('messagetransaction', callback);
我找到并修改了

  • 向上插入计数器(如果计数器不存在,则创建并初始化它)
  • 递增计数器
  • 使用递增的值调用回调
在使用以下代码的单个DB往返中:

var Counters = new Schema({
  _id:String, // the schema name
  count: Number
});

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

var Counter = mongoose.model('Counter', Counters);

/**
 * Increments the counter associated with the given schema name.
 * @param {string} schemaName The name of the schema for which to
 *   increment the associated counter.
 * @param {function(err, count)} The callback called with the updated
 *   count (a Number).
 */
function incrementCounter(schemaName, callback){
  Counter.findAndModify({ _id: schemaName }, [], 
    { $inc: { count: 1 } }, {"new":true, upsert:true}, function (err, result) {
      if (err)
        callback(err);
      else
        callback(null, result.count);
  });
}
享受吧!
-Curran使Mongoose 3.x的工作版本增加

var mongoose = require('mongoose');

var CounterSchema = new mongoose.Schema({
    _id: String,
    next: {type: Number, default: 1}
});

CounterSchema.statics.increment = function (counter, callback) {
    return this.findByIdAndUpdate(counter, { $inc: { next: 1 } }, {new: true, upsert: true, select: {next: 1}}, callback);
};
使用类似以下内容:

Counter.increment('photo', function (err, result) {
    if (err) {
        console.error('Counter on photo save error: ' + err); return;
    }
    photo.cid = result.next;
    photo.save();
});

我希望有人能派上用场

这在Mongoose 3.x中得到了充分的支持,尽管名称略有不同


有很多答案,但我发现这个简单的解决方案

Counter.findByIdAndUpdate(ID, {$inc: {next:1}}, function (err, data) {


});

在版本3中,mongoose findOneAndUpdate方法公开mongodb的findAndModify操作。它是这样工作的:

var query = { name: 'Sprinkls' };
var update = { name: 'Sprinkles' };
var options = { new: false };
Cat.findOneAndUpdate(query, update, options, function (err, cat) {
  if (err) ..
  render('cat', cat);
});

此处的更多信息:

只是补充了一个问题,即如果您在查询中使用objectId,mongoDB将无法找到您的文档。mongoose层负责将从路由参数获得的十六进制字符串对象id转换为正确的对象id

要解决此问题,您需要:

var ObjectID = require('mongodb').ObjectID;


var itemId = req.params.itemId;
var objectId = ObjectID.createFromHexString(itemId);
Item.findAndModify({_id: objectId},

根据上述回复,这是我承诺的解决方案:

// eslint-disable-next-line func-names
localeTypesSchema.statics.findAndModify = function (query, sort, update, opts, callback) {
    const cb = callback || (() => { });
    try {
        const result = this.collection.findAndModify(query || {}, sort || [], update || {}, opts);
        cb(null, result);
        return Promise.resolve(result);
    } catch (err) {
        cb(err);
        return Promise.reject(err);
    }
};

根据mongodb文档,findAndModify应如下所示,Collection.prototype.findAndModify=函数(查询、排序、更新、新建文档、删除文档、函数(err){/}),但将其转换为mongoose类型时不起作用!请澄清这一点!Mongoose v3文档:或者,当然,您可以在实例上添加一个增量方法如何通过此方法获取findAndModify的返回值?我想,与其他任何地方一样,通过从回调函数中的第二个参数读取它。我得到return=undefinedIt确实很方便,但FWIW我最终想出了基于Redis的计数器。更快、更简单。这些仅允许查找单个entriesMongoDB具有相同的限制()。现在这些都不推荐使用。@chovy在当前版本(5.11.19)中没有一个不推荐使用