简单的猫鼬变量更新节点js

Simple mongoose variable update nodejs

本文关键字:更新 节点 js 变量 简单      更新时间:2023-09-26

我有猫鼬模式:

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

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

也。。。如果苹果还没有在数据库中(即代码第一次运行),我希望它插入它。

这是我所做的:

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"对象

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

您似乎始终将筛选器和更新文档设置为相同的值。 这意味着您只会添加记录。 我的意思是:

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

你将尝试找到一个苹果为0的记录,然后更新记录,使苹果等于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)
  })