【问题标题】:findOneAndUpdate not updatingfindOneAndUpdate 不更新
【发布时间】:2019-05-21 02:11:48
【问题描述】:

我正在尝试使用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 找到正确的文档,并且我特别希望使用 req.body 中存在的内容更新 parserConfig 字段。为了测试目的,我现在对所有内容都进行了硬编码。发送 PUT 请求目前在 Postman 中给了我这个答案:

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

postman 中的响应是 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

上面写着:

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

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

【问题讨论】:

  • 想到的一些事情:你确认 req.params.id 被正确解析了吗?您是否确认该对象未在数据库中正确更新?您是否尝试了 update() 函数而不是 findOneAndUpdate?您是否尝试过直接使用 findOneAndUpdate 手动更新 mongo 中的文档,而不使用 mongoose,例如在 CLI 或 roboMongo 中?另外,您可以发布您的架构吗?
  • 感谢您的精彩想法。它在一定程度上帮助了我。这是新闻(逐步解决您的问题): 1)很快就会出现 2)是 3)否 4)刚刚使用 Studio 3T 尝试过。运行 findOneAndOnly 确实更新了 companyName。这让我尝试在我的代码中使用完全相同的查询(所有内容都被硬编码,即使是 uniquecompanyID),但它仍然没有更新。(我猜这消除了你的第一个问题想法)。调试器仍然显示我正在执行 findOne。我们的架构是这样的const configs = mongoose.model('configs', new mongoose.Schema());
  • 请检查更新@BenSower
  • 好的,但是这些字段是在 Schema 中实际定义的,还是您只是在整个定义中使用混合类型?
  • 好的,刚刚看到你的更新!这实际上可能与猫鼬问题有关,这也是 3T 工作室正常工作的原因。那么您可以尝试使用所需字段手动定义您的架构吗?

标签: typescript express mongoose


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    后记

    如果有人想知道,您还可以将strict: false 添加到更新查询中,如下所示。这会覆盖架构中 strict 的任何值。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我觉得很奇怪,当我清楚地使用configs.findOneAndUpdate 时,它却说我使用的是configs.findOne ??
      • 是的,刚刚测试过,应该是configs.findAndModify
      猜你喜欢
      • 2021-11-20
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多