findAndModify或findOneAndUpdate - "不是函数"

时间:2017-07-29 10:31:36

标签: node.js mongodb mongoose

首先,哪一个最好? findAndModifyfindOneAndUpdatefindByIdAndUpdate

就我而言,我有一张这样的桌子:

seqkeys

{ 
    "_id" : "invoice", 
    "seq" : NumberInt(1)
},
{ 
    "_id" : "receipt", 
    "seq" : NumberInt(1)
}

我想查找发票的序号,添加1并保存。 (然后使用该号码将真实发票记录保存在发票表中)

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

TypeError: seqkeysTable.findAndModify is not a function

所以这是我的模特:

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

这是我的findkey nodejs函数....

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

2 个答案:

答案 0 :(得分:5)

Mongoose有findOneAndUpdate(相当于mongoBD findAndModify。MongoDB还在版本> = 3.2)和findByIdAndUpdate中引入了findOneAndUpdate。这就是为什么findAndModify不适用于Mongoose。

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

答案 1 :(得分:1)

findAndModify是MongoBD的功能,这就是为什么它不适用于Mongoose的原因。

findOneAndUpdatefindByIdAndUpdate在MongoDB上都可以很好地工作,也许如果您希望使用ID在数据库中进行搜索,那么就去findByIdAndUpdate,否则,如果您正在使用自定义参数进行搜索然后在数据库中使用findOneAndUpdate。 但是,如果您尝试使用findByIdAndUpdatefindOneAndUpdate,则可能会收到以下警告

DeprecationWarning: collection.findAndModify is deprecated. Use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead.

要消除这种情况,请在您的代码中写上以下内容

mongoose.set('useFindAndModify', false);