Mongoose findOneAndUpdate 不会更新我的数据库

Posted

技术标签:

【中文标题】Mongoose findOneAndUpdate 不会更新我的数据库【英文标题】:Mongoose findOneAndUpdate won't update my database 【发布时间】:2020-07-11 03:25:11 【问题描述】:

我在开发应用程序时正在自学 NodeJS。我使用 Mongoose 和 Axios

在应用程序的一个部分,我显示合作伙伴,当我点击更新时,我会得到一个包含所选合作伙伴信息的表格,以便更新他们。

客户端将信息发送到服务器,但服务器不会更新数据库中的条目。这是我的服务器端

app.post("/api/partner/update", (req, res) => 
const id = req.body.id;
const fullname = req.body.fullname;
const email = req.body.email;
const phones = req.body.phones;
const shops = req.body.shops;
const company = req.body.company;

console.log("The body is ",req.body) //It returns the correct data from the client's side submited data

Partner.findOneAndUpdate(id, mongoose.set('useFindAndModify', false),
 
    "fullname": fullname,
    "email": email,
    "phones": phones,
    "shops":shops,
    "company": company
  ,
  (err, document) => 
    if (err) return err;
    //console.log(document);
    res.send( document );  

  
););

这是我的模型:

 const mongoose = require("mongoose");

const partnerSchema = mongoose.Schema(
  
    fullname: 
      type: String,
      maxlength: 50,
      required: true
    ,
    email: 
      type: String,
      trim: true,
      unique: 1,
      required: true
    ,
    phones: 
      type: Array
    ,
    company: 
      type: String,
      maxlength: 50,
      required: true
    ,
    shops: 
      type: Array,
      default: 0
    ,
    is_valid: 
      type: Boolean
    ,
    validated_by: 
      type: String
    ,

    created_by: 
      type: String,
      maxlength: 50
    ,
    updated_by: 
      type: String
    ,
    deleted_by: 
      type: String
    ,
    deleted_at: 
      type: Date,
      default: null
    
  ,
  
    timestamps: 
      createdAt: "created_at",
      updatedAt: "updated_at"
    
  
);

const Partner = mongoose.model("Partner", partnerSchema)
module.exports =Partner

我不明白为什么它不更新数据库中的字段

【问题讨论】:

【参考方案1】:

参考文档,https://mongoosejs.com/docs/tutorials/findoneandupdate.html findOneAndUpdate的第一个参数应该是一个过滤器对象,而不是直接的id。

所以请尝试Partner.findOneAndUpdate('_id': id,....

【讨论】:

【参考方案2】:

根据文档,这是 findOneAndUpdate 的语法:

var query =  name: 'borne' ;
Model.findOneAndUpdate(query,  name: 'jason bourne' , options, callback)

将数据库查询更改为:

let query = _id: id ;
let dataToUpdate= 
    "fullname": fullname,
    "email": email,
    "phones": phones,
    "shops":shops,
    "company": company
  
let options = useFindAndModify: false  // useFindAndModify set to false at query level
// options = useFindAndModify: false,new:true if you want updated docs in return


 Partner.findOneAndUpdate(query,dataToUpdate,options,(err, document) => 
        if (err) return err;
        //console.log(document);
        res.send( document );  

      
    )

在猫鼬级别使用选项设置弃用警告打开或关闭

mongoose.set('useFindAndModify', false)

在此处阅读更多信息:

Deprecation Warnings

findOneAndReplace

你也可以使用findByIdAndUpdate方法:

Model.findByIdAndUpdate(id, update, options, callback)

您可以启用 Promise 以使代码更具可读性和可测试性: https://mongoosejs.com/docs/promises.html

【讨论】:

以上是关于Mongoose findOneAndUpdate 不会更新我的数据库的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose:findOneAndUpdate 不返回更新的文档

Mongoose - 使用 findOneAndUpdate 更新子文档

Mongoose `findOneAndUpdate` 回调不传递更新的文档

Mongoose `findOneAndUpdate` 回调不传递更新的文档

Mongoose:findOneAndUpdate 不适用于多种条件

Mongoose findOneAndUpdate 更新多个字段