findOneAndUpdate()在upsert中返回null值

时间:2016-01-31 11:17:32

标签: node.js mongodb mongoose

我是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时,它不应为null。

因为我在返回的对象的value属性中得到null,所以它会导致出现此错误并粉碎我的应用程序。

TypeError: Cannot read property 'sequence' of null

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

任何想法如何解决这个问题??

1 个答案:

答案 0 :(得分:7)

根据2.0 node.js本机驱动程序documentation,控制findOneAndUpdate是否返回原始文档或新文档的选项称为returnOriginal,而不是new。< / p>

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

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。非常混乱。