在Node.js中使用findAndModify时出错

在Node.js中使用findAndModify时出错,node.js,mongodb,mongoose,mongodb-query,Node.js,Mongodb,Mongoose,Mongodb Query,我很难使用查找和修改。以下是我的代码和错误:- var userSchema = new Schema({ incr: Number, practicename: String, basicinformation: [ { recordno: String, firstname: String, middlename: String, lastname: Str

我很难使用
查找和修改
。以下是我的代码和错误:-

var userSchema = new Schema({
    incr: Number,
    practicename: String,
    basicinformation: [
        {
            recordno: String,
            firstname: String,
            middlename: String,
            lastname: String,
            gender: String,
            dateofbirth: Date,
            dateofdeath: Date,
            socialsecurityno: String,
            status: String,
            updateddate: Date,
            updatedby: String
        }
    ],

userSchema.statics.findAndModify = function (query, sort, doc, options, callback) {
    return this.collection.findAndModify(query, sort, doc, options, callback);
}
库/控制器

var query = {
        update: { $inc: { incr: 1 } },
        upsert: true
    };

    User.findAndModify(query, function (err, users) {
        if (err) return res.send(500)
        if (!err) console.log(users)
    });
错误:-

Error: Illegal sort clause, must be of the form [['field1', '(ascending|descendi
ng)'], ['field2', '(ascending|descending)']]
    at Object.exports.formattedOrderClause (D:\Projects\project1\node_modules\mongoose\node_modules\mongodb\lib\mongodb\utils.js:41:1
1)
    at Collection.findAndModify (D:\Projects\project1

首先,去掉这段代码,因为您不需要它,实际上您正在定义一个“静态”签名,您甚至没有使用它:

userSchema.statics.findAndModify = function (query, sort, doc, options, callback) {
    return this.collection.findAndModify(query, sort, doc, options, callback);
}
您的
用户
模型应该有如下声明:

var User = mongoose.model( "User", userSchema );
现在让我们看一下mongoose方法在长格式中的用法:

User.findOneAndUpdate(
    { _id: userid },                 // this is what "query" means
    { "$inc": { "incr": 1 } },       // this is what "update" means
    { "upsert": true },              // this is what "options" means
    function(err,user) {
您试图使用“本机”收集方法,而不是使用Mongoose已经存在的方法。这还显示了需要传递给此方法的正确参数,这些参数将在提供的文档链接中进一步解释


另请参见.findAndModify()方法的基本变体和其他方法。

首先,删除此代码,因为您不需要它,实际上您正在定义一个您甚至没有使用的“静态”签名:

userSchema.statics.findAndModify = function (query, sort, doc, options, callback) {
    return this.collection.findAndModify(query, sort, doc, options, callback);
}
您的
用户
模型应该有如下声明:

var User = mongoose.model( "User", userSchema );
现在让我们看一下mongoose方法在长格式中的用法:

User.findOneAndUpdate(
    { _id: userid },                 // this is what "query" means
    { "$inc": { "incr": 1 } },       // this is what "update" means
    { "upsert": true },              // this is what "options" means
    function(err,user) {
您试图使用“本机”收集方法,而不是使用Mongoose已经存在的方法。这还显示了需要传递给此方法的正确参数,这些参数将在提供的文档链接中进一步解释

另请参见.findAndModify()方法的基本变体和其他方法。

您可以尝试mongoose方法

Model.findByIdAndUpdate( id, { $set: {name: 'xyz'}} , { new:true}, function(err,result) {
    if ( err ) {
        console.warn(err);
    } else {
        console.log(result);
    }
});
选项
new:true
返回更新的文档,否则旧的未更新文档

您可以尝试mongoose方法

Model.findByIdAndUpdate( id, { $set: {name: 'xyz'}} , { new:true}, function(err,result) {
    if ( err ) {
        console.warn(err);
    } else {
        console.log(result);
    }
});

选项
new:true
返回已更新的文档,否则将返回未更新的旧文档

您是否意识到您已更改了此方法的默认签名?您不需要像以前那样声明
静态
。使用默认方法,并再次查看文档,因为您的参数是错误的。当我在没有统计信息的情况下直接使用它时,我会得到TypeError:-
TypeError:Object function model(doc,fields,skipId){if(!(this instanceof model))返回新模型(doc,fields,skipId);model.call(this,doc,fields,skipId);}没有方法“findAndModify”
您知道您已经更改了此方法的默认签名,所以您没有更改吗?您不需要像以前那样声明
静态
。使用默认方法,并再次查看文档,因为您的参数是错误的。当我在没有统计信息的情况下直接使用它时,我会得到TypeError:-
TypeError:Object function model(doc,fields,skipId){if(!(this instanceof model))返回新模型(doc,fields,skipId);model.call(this,doc,fields,skipId);}没有方法“findAndModify”
当我运行上述代码时,记录不会递增…我可以在我的CMD中看到
POST/api/users/create 500 10ms-21b
@在我的示例中,Anup
userid
是您需要传入的内容。您是否已将其强制转换为
对象ID
?如果您将此作为POST数据的一部分获取,则需要。默认情况下,回调中的
用户
是修改过的文档。上面的代码可以工作,但当我签入数据库时,值不会增加……在控制台中,我得到这个
{u id:538c43bf7b412a14637605ec,userrecordno:13}
@Anup您没有阅读上面的注释。您需要强制转换到ObjectId。它不“工作”,因为您正在将和ObjectId与字符串进行比较。感谢所有的帮助…我刚刚重新启动了Robomongo…它工作得非常好。。。!当我运行上面的代码时,记录不会增加…我可以在我的CMD中看到
POST/api/users/create 500 10ms-21b
@在我的示例中,Anup
userid
是您需要传入的内容。您是否已将其强制转换为
对象ID
?如果您将此作为POST数据的一部分获取,则需要。默认情况下,回调中的
用户
是修改过的文档。上面的代码可以工作,但当我签入数据库时,值不会增加……在控制台中,我得到这个
{u id:538c43bf7b412a14637605ec,userrecordno:13}
@Anup您没有阅读上面的注释。您需要强制转换到ObjectId。它不“工作”,因为您正在将和ObjectId与字符串进行比较。感谢所有的帮助…我刚刚重新启动了Robomongo…它工作得非常好。。。!