findAndModify或findOneAndUpdate - “不是一个函数”

5

首先,哪一个更好呢?findAndModifyfindOneAndUpdate还是findByIdAndUpdate

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

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 Node.js函数...

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个回答

18

Mongoose有findOneAndUpdate(相当于MongoDB的findAndModify)。MongoDB在3.2版本及以上引入了findOneAndUpdatefindByIdAndUpdate。这就是为什么findAndModify无法与Mongoose一起使用的原因。

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


谢谢 Talha - 我会尝试使用 findByIdAndUpdate 看看它是否有效。 - torbenrudgaard
1
https://docs.mongodb.com/manual/search/?query=findByIdAndUpdate哈哈哈,我猜他们忘记在手册中加入这个了 :-D - torbenrudgaard
2
不是的 :) findByIdAndUpdate 不是 mongoDB 的一部分,而是 Mongoose 的。 - Talha Awan

5

findAndModify是MongoDB的一个函数,因此它不能与Mongoose一起使用。

findOneAndUpdatefindByIdAndUpdate都可以很好地与Mongoose配合使用。如果您希望使用_id在数据库中进行搜索,则可以使用findByIdAndUpdate,否则如果您使用不同的字段来搜索数据库,则使用findOneAndUpdate

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

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

为了消除这个问题,在您的代码中使用以下内容:
mongoose.set('useFindAndModify', false);

为了避免误解,findByIdAndUpdatefindOneAndUpdate之间的区别如下:

findByIdAndUpdate(id, ...)等同于findOneAndUpdate({ _id: id }, ...)


这个答案是误导性的,mongoDB 中没有叫做 findByIdAndUpdate 的东西。正如 Talha 在上面的回答中提到的那样,findByIdAndUpdate 是 mongoose 中的方法。 - whoami - fakeFaceTrueSoul
你在这里把“MongoDB”拼错成“MongoBD”了吗? - garson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接