【问题标题】:Set a value with mongoose in NodeJS在 NodeJS 中使用 mongoose 设置值
【发布时间】:2014-10-16 02:56:51
【问题描述】:

我有一个与 Angular 应用程序通信的 NodeJS 应用程序。这是一个简化版本,但我会尝试解释我的问题:

我会从socket连接中获取一个值,例如:

{
    Id : "1", 
    Checked : true, 
    TeamName : "Team1"
}

我想用 mongoose 更新 mongoDb,以便每个具有 TeamName : "Team1" 的人都获得值 Checked : true。

我做过这样的事情:

relayModel.find({TeamName : 'Team1'}, 
     {'$set' :{Checked: true}},function(err,docs){
                    if(err){
                        console.log("Could not save value for relay runner: ", err);
                    }
                    else{
                        console.log("The runners updated: ",docs)
                    }

但我得到了错误:

Could not save value for relay runner:  
{ [MongoError: Can't canonicalize query: 
BadValue Unsupported projection option: 
$set: { Checked: true }] name: 'MongoError' }

【问题讨论】:

  • 你想要.update() 而不是.find()
  • 只更新一个人。我想更新所有具有相同团队名称的人。
  • 嗯。您是否查看过“多”选项的文档?我猜不会。这就是为什么我说.update() 而不是猫鼬中的“查找和更新”品种之一。
  • 谢谢! relayModel.update({TeamName : 'Team1'}, {Checked: true},{multi:true},function(err,nbr, docs){ if(err){ console.log("无法保存中继赛跑者的值: ", err); } else{ console.log("跑步者更新:",docs) }

标签: javascript angularjs node.js mongodb mongoose


【解决方案1】:

这确实有据可查。肯定会消失,但只是为了给你解释一下:

relayModel.update(
    { "TeamName": "Team1" },
    { "$set": { "Checked": true } },
    { "multi": true },
    function(err,numAffected) {
        if (err) throw err;
        console.log( "updated n docs: %s", numAffected );
    }
);

因此,带有“multi”选项的.update() 会影响多个文档,没有它只会影响匹配的第一个文档。回调中的返回值是标准的err 和“受影响的文档数”。

因此基本上来说:

  1. 您实际上需要和操作员“更新”才能影响和更新。

  2. 您为多个文档设置了“multi”,并且您只获得返回的数字以及使用$set 运算符来影响您想要更改的字段。

【讨论】:

  • 是否有可能在return语句中获取更新的字段?
  • @petur 不适用于多个文档。对于每个人,您可以查看.findOneAndUpdate() 和表亲,它们基本上以修改后的形式返回文档。但是任何超过多重形式的东西都没有。如果您想获取修改后的文档,那么您正在循环更新。
猜你喜欢
  • 2019-11-20
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2019-03-30
相关资源
最近更新 更多