findOneAndUpdate不更新

时间:2018-12-20 14:30:32

标签: typescript express mongoose

我正在尝试使用findOneAndUpdate更新存储在猫鼬服务器中的文档之一。我将其设置为PUT请求,这就是我定义它的方式。

public updateConfigWithType(req: Request, res: Response) {
    configs.findOneAndUpdate({'companyInfo.uniquecompanyid': req.params.id}, { $set: { companyName: "ITSWORKING" }} ,(err,doc) => {
        if (err) {
            res.send(err);
        }else {
          res.json({
              message: 'Succesfully updated this item'
          });
        }
    })
}

我的PUT请求URL的设置如下:http://localhost:3000/parserConfig/123123wfdwedfwfwefwef

这是猫鼬服务器上存在于我文档中的JSON数据的一小部分:

{
    "_id": {
        "$oid": "5bbf27ad4cf8a6be65ea6257"
    },
    "companyInfo": {
        "companyName": "example",
        "hashKey": "sdfsdf",
        "hashFunction": "sdfsdf",
        "uniquecompanyid": "123123wfdwedfwfwefwef"
    },
    "version": "1",
    "__v": 0,
    "parserConfig": {
        "id": {
            "fieldName": "key",
            "path": "key"
    },

因此,我希望能够通过URL中的uniquecompnayid找到正确的文档,我特别想使用parserConfig中存在的内容来更新req.body字段。我现在将所有内容都进行了硬编码以用于测试。.发送PUT请求目前在邮递员中给了我这个答案:

{"message":"Succesfully updated this item"}

但是没有任何更新。我想念什么?

更新

我出于测试目的更改了代码...这是我尝试过的:

public updateConfigWithType(req: Request, res: Response) {
  var query = {'companyInfo.uniquecompanyid':req.params.id};
  configs.findOneAndUpdate(query, {$set:{'companyInfo.uniquecompanyid':"heheheheh"}}, {new:true}, function(err, doc){
      if (err) {
        return res.send(err);
      }
      return res.send(doc);
  });
}

邮递员中的回复是OLD文档。什么都没改变

spyros请求后更新

10:26:34 PM web.1 |  Mongoose: configs.findOne({ 'companyInfo.uniquecompanyid': '123123wfdwedfwfwefwef' }, { new: true, projection: {} })
10:26:34 PM web.1 |  PUT /parserConfig/123123wfdwedfwfwefwef 200 158.118 ms - 2089

更新新信息通知

我遇到了这个:https://github.com/Automattic/mongoose/issues/7011

它说:

我注意到,当使用架构中没有的更新doc属性调用findOneAndUpdate时,调试输出显示(错误)?收集方法。

为什么通过Studio 3t而不是通过我的代码更新相同的属性,为什么?

3 个答案:

答案 0 :(得分:1)

启用调试日志记录: mongoose.set('debug', true);。这将向您显示执行的查询。我认为该错误可能与某些属性的拼写错误或不同的对象ID有关。 如果那没有帮助,请使用调试结果信息更新您的问题,以便我可以更新答案。

答案 1 :(得分:0)

从Mongoose v7.6.2开始,documentation声明:

  

strict选项(默认情况下启用)可确保传递给我们的模型构造函数的未在架构中指定的值不会保存到数据库中。

与您一样,由于文档差异很大,因此无法为集合定义架构。对我来说,诀窍是在集合的架构中添加strict: false

import { Schema } from 'mongoose';

const DynamicDocumentSchema = new Schema(
  { bar: String },
  { strict: false }
);

POSTSCRIPT

万一有人想知道,您也可以像下面一样将strict: false添加到更新查询中。这将覆盖架构中strict的任何值。

await DynamicDocumentModel.findByIdAndUpdate(
  docId,
  {
    $set: <whatever_update>
  },
  { strict: false }
);

答案 2 :(得分:0)

我也遇到了类似的 findOneAndUpdate 问题。在浏览了大量的文章和视频后,我发现 Mongoose 的架构构造函数支持第二个选项参数。

其中一个选项是“strict”,这意味着通过模型实例传递给 mongodb 的强制值与架构中指定的值相同。

如果该选项设置为值对 { strict: true },如果架构和传入的值之间存在任何差异,则更新将失败。要覆盖此行为,应将 strict 设置为 false。

顺便说一句,我读过的所有内容都没有提到这个选项。在阅读此处的文档之前,我无法弄清楚发生了什么:https://mongoosejs.com/docs/2.7.x/docs/schema-options.html

相关问题