【问题标题】:findOneAndUpdate() returns null in value on upsertfindOneAndUpdate() 在 upsert 上返回 null 值
【发布时间】:2016-05-08 21:09:34
【问题描述】:

我是 mongodb 和 mongoose 的新手。

请帮帮我!我陷入了下面描述的这个问题。

我有这个从控制器(路由器)调用的静态方法。

IDCounterSchema.statics.getNextID = function(collectionName, callback){

    this.collection.findOneAndUpdate(
        {name: collectionName},
        {$inc: {sequence:1}},
        {new: true, upsert: true},
        callback
    );
};

但是,当我在初始应用启动后第一次调用它时,它返回 null 值。

{ lastErrorObject: { updatedExisting: false, n: 0 },
  value: null,
  ok: 1 } // 1 means the execution succeeded 
          // in fact, i see the inserted data in mongo database.

根据this mongodb document,当upsert&new属性为真时,它不应该为空。

因为我在返回对象的 value 属性中得到了 null,所以会导致这个错误并破坏我的应用程序。

TypeError: Cannot read property 'sequence' of null

但是,在第二次启动应用程序后,当我调用相同的静态方法时,它可以正常工作而不会出现任何错误。

知道如何解决这个问题吗??

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    根据2.0 node.js原生驱动documentation,控制findOneAndUpdate返回原始文档还是新文档的选项称为returnOriginal,而不是new

    所以你的代码需要看起来像这样:

    this.collection.findOneAndUpdate(
        {name: collectionName},
        {$inc: {sequence:1}},
        {returnOriginal: false, upsert: true},
        callback
    );
    

    但最好直接在 Mongoose 中使用 Model.findOneAndUpdate 执行此操作,其中选项 is 命名为 new:

    this.findOneAndUpdate(
        {name: collectionName},
        {$inc: {sequence:1}},
        {new: true, upsert: true},
        callback
    );
    

    您链接到的文档适用于 MongoDB shell 中的 findAndModify,其中该选项也被命名为 new。非常混乱。

    【讨论】:

    • @Hayatomo 嗯...我不知道,当我用 Mongoose 4.3.7 尝试它时效果很好。回调的参数结构与 Mongoose 不同,这可能是您所看到的吗?
    • 两个代码都有效!执行第一个代码和第二个代码时,我没有注意到返回对象的结构不同,所以我需要做一些工作才能使第二个代码工作。
    • 即使 returnOriginal 为 false,当插入文档时,我也会返回 null。而如果文档更新,我会按预期返回值
    猜你喜欢
    • 2016-01-26
    • 2013-06-19
    • 2019-10-14
    • 2020-09-13
    • 2019-05-01
    • 2014-09-26
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多