简单的mongoose变量更新nodejs

时间:2016-07-13 11:52:19

标签: javascript node.js mongodb mongoose

我有mongoose架构:

var mongoose = require('mongoose')
var Schema = mongoose.Schema

var myItem = new Schema({
  apple: String
})
var MyItem = mongoose.model('MyItem', myItem)

如您所见,此模型中只有一个名为apple的变量。我想要做的是,每次调用一个方法时,我都希望使用新的apple值更新模式。例如。 apple值不断变化,因此需要覆盖db中的现有值。

另外......如果apple不是db(即代码第一次运行),我希望它插入它。

这就是我所做的:

MyItem.findOneAndUpdate({apple: apple}, {apple: apple}, {upsert: true}, function (error, updatedApple) {
    if (error) {
      console.log('Error')
    }
    console.log(updated)
  })

然而,这给了我以下结果:

> db.myitems.find()
{ "_id" : ObjectId("578629399a18c920d5e1a988"), "apple" : NaN, "__v" : 0 }
{ "_id" : ObjectId("578629469a18c920d5e1a989"), "apple" : 0, "__v" : 0 }

它应该如何工作: 仅添加一个新条目是苹果具有不同的值。我希望它只是更新相同的条目 - 所以总会有一个。

因此,例如,当您执行以下> db.myitems.find()时,您将看到一个记录的不是两个。所以你要么看到

{ "_id" : ObjectId("578629399a18c920d5e1a988"), "apple" : NaN, "__v" : 0 }

或者你会看到这个:

 { "_id" : ObjectId("578629469a18c920d5e1a989"), "apple" : 0, "__v" : 0 }

然而,我将它们都归还,而不仅仅是更新它。

我也尝试将{new:true}添加到选项中,但这只是一直返回一个'null'对象

1 个答案:

答案 0 :(得分:0)

好的,所以我可能会遗漏一些东西但是如果我不是,我会扩展我的评论。

出现您始终将过滤器和更新文档设置为相同的值。这意味着您只会添加记录。这就是我的意思:

var apple = 0;
MyItem.findOneAndUpdate({apple: apple}, {apple: apple}, {upsert: true}, function (error, updatedApple) {
    if (error) {
      console.log('Error')
    }
    console.log(updated)
  })

鉴于apple为0,你将尝试找到apple为0的记录,然后更新记录,使得apple等于0(如果有的话;那么这是没有变化的),否则你将插入一个苹果等于0的新记录。

从您的示例代码中,我希望您实际上尝试增加apple,在这种情况下,更新文档(第二个参数)需要{$inc : { apple : 1 }}

否则,您需要维护两个变量;一个用于您正在搜索的苹果值,一个用于您想要的苹果值(实际上可能是相同的值,但您不知道它们将是先验的)。

在你的数据库条目示例中,我会做这样的事情(未经测试): var oldApple = NaN; //或者你得到你的搜索值 var newApple = 0;

MyItem.findOneAndUpdate({apple: oldApple}, {apple: newApple}, {upsert: true}, function (error, updatedApple) {
    if (error) {
      console.log('Error')
    }
    console.log(updated)
  })