我有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'对象
答案 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)
})