findOneAndUpdate()在upsert时返回null值

13

我是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 properties为true时,value不应为null。
因为我在返回对象的value属性中得到了null,导致了这个错误并且使我的应用程序崩溃。
TypeError: Cannot read property 'sequence' of null

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

有什么办法可以解决这个问题吗?

1个回答

18
根据2.0版node.js本地驱动文档,控制findOneAndUpdate返回原始文档还是新文档的选项名为returnOriginal,而不是new。因此你的代码应该像这样:
this.collection.findOneAndUpdate(
    {name: collectionName},
    {$inc: {sequence:1}},
    {returnOriginal: false, upsert: true},
    callback
);

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

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

您链接的文档是关于MongoDB shell中的findAndModify,其中选项也被命名为new。非常令人困惑。

@Hayatomo 嗯...我不知道,当我尝试使用Mongoose 4.3.7时,它运行得很好。你的回调参数结构与Mongoose不同,这可能是你看到的问题吗? - JohnnyHK
3
两段代码都能运行!我没有注意到第一段代码和第二段代码执行时返回对象的结构不同,所以我需要做一些工作来使第二段代码能够运行。 - user5809117
即使将 returnOriginal 设置为 false,当插入文档时,我仍然得到 null。而如果更新文档,则按预期得到值。 - Zach Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接