findAndModify或findOneAndUpdate - "不是函数"

tor*_*ard 3 mongoose mongodb node.js

首先,哪一个最好? findAndModifyfindOneAndUpdatefindByIdAndUpdate

在我的情况下,我有一个这样的表:

seqkeys

{ 
    "_id" : "invoice", 
    "seq" : NumberInt(1)
},
{ 
    "_id" : "receipt", 
    "seq" : NumberInt(1)
}
Run Code Online (Sandbox Code Playgroud)

我想找到发票的序号,加1并保存.(然后使用该编号将实际发票记录保存在发票表中)

但我不能让这个工作,我不断得到

TypeError: seqkeysTable.findAndModify is not a function
Run Code Online (Sandbox Code Playgroud)

所以这是我的模型:

var mongoose      = require('mongoose');
var Schema        = mongoose.Schema;
var seqkeysSchema = new Schema({
    _id:                String,     // Table Name
    seq:                Number      // Sequence Number
});
module.exports = mongoose.model('seqkeysModel', seqkeysSchema,'seqkeys');
Run Code Online (Sandbox Code Playgroud)

这是我的findkeynodejs函数....

var seqkeysModel = require('../../models/seqkeysModel');
var seqkeysTable = mongoose.model('seqkeysModel');
var findKey = function(tableName) {
    return new Promise((resolve, reject) => {
    seqkeysTable.findAndModify(
        { "_id": tableName },
        { $inc: {"seq":1} },
        { new: true }
    ,function (err, data) {
        if (err) {
            reject(new Error('findKey ERROR : ' + err));
            return;
        } else {
            resolve(data.seq);
        };
    });
})};    
Run Code Online (Sandbox Code Playgroud)

Tal*_*wan 7

Mongoose有findOneAndUpdate(相当于mongoBD findAndModify .MongoDB也在版本> = 3.2中引入了findOneAndUpdate)和findByIdAndUpdate.这就是为什么findAndModify不能与Mongoose一起使用的原因.

至于哪一个更好,在findOneAndUpdate中,您可以传递包含多个字段的查询对象.findByIdAndUpdate仅将id作为第一个参数.

  • 不,他们没有:) findByIdAndUpdate不是mongoDB的一部分。是猫鼬的。 (2认同)

Der*_*aju 5

findAndModify是 MongoDB 的一个函数,这就是为什么它不适用于 Mongoose。

findOneAndUpdatefindByIdAndUpdate与 Mongoose 配合得很好,也许如果您希望使用 _id 在数据库中搜索,那么请使用findByIdAndUpdateelse 如果您使用不同的字段在数据库中搜索,则使用findOneAndUpdate.

但是,如果您尝试在 MongoDB 中使用findAndModify,您可能会收到以下警告:

DeprecationWarning: collection.findAndModify is deprecated. Use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead.
Run Code Online (Sandbox Code Playgroud)

要消除这种情况,请在代码中使用以下内容:

mongoose.set('useFindAndModify', false);
Run Code Online (Sandbox Code Playgroud)

以防万一,findByIdAndUpdate&之间的区别findOneAndUpdate

findByIdAndUpdate(id, ...) 相当于 findOneAndUpdate({ _id: id }, ...)