【问题标题】:Can't get MongoDB update query to work in Node.JS无法让 MongoDB 更新查询在 Node.JS 中工作
【发布时间】:2014-12-11 06:25:48
【问题描述】:

我已经阅读过文档、教程和 SO。我似乎无法找到关于如何正确更新数据库中已有条目的正确答案。

我可以很好地插入数据,但第二次我尝试使用以下查询更新它,它失败了。它在某种程度上是错误的,但我无法弄清楚。我从文档、tuts 等中复制。仍然不行。

我的插入工作正常,所以不会是连接问题。

这是我的更新代码

db.collection("usercollection").findOne({ 'playerName': sPlayerName, 'playerId': sPlayerID})

db.collection("usercollection").update({ 'playerName': sPlayerName },{$set: { 'playerScore': sPlayerScore}});

我正在尝试使用 $set 更新“playerScore”字段。

据我了解,我必须先“findOne”条目然后更新它。当我在 Node.JS 应用程序中运行更新代码时,我不断收到“TypeError:对象不是函数”错误消息。

这是我的全部功能:

    function insertEntry(sPlayerName, sPlayerID, sPlayerScore, sPlayerHealth) 
{
        var Db = require('mongodb').Db,
        MongoClient = require('mongodb').MongoClient,
        Server = require('mongodb').Server,
        ReplSetServers = require('mongodb').ReplSetServers,
        ObjectID = require('mongodb').ObjectID,
        Binary = require('mongodb').Binary,
        GridStore = require('mongodb').GridStore,
        Grid = require('mongodb').Grid,
        Code = require('mongodb').Code,
        BSON = require('mongodb').pure().BSON,
        assert = require('assert');

        var db = new Db('mdata', new Server('localhost', 27017));
            db.open(function(err, db) {
                if(!err) {
                // Fetch a collection to insert document into
        var collection = db.collection("usercollection"); 

        if(sPlayerScore < 101) {
            db.collection("usercollection").insert({ 'playerName': sPlayerName, 'playerId': sPlayerID, 'playerScore': sPlayerScore}, { w: 0 }); }

        else if(sPlayerScore > 190) {
            db.collection("usercollection").findOne({ 'playerName': sPlayerName, 'playerId': sPlayerID})
            db.collection("usercollection").update({ 'playerName': sPlayerName },{$set: { 'playerScore': sPlayerScore}});
            }
        }
   });
}

我知道这不完全是 ActiveRecord 或任何东西,但我认为我可以使用 MongoDB 以类似的方式“findByAttributes”。

编辑:

我使用错误回调更新了我的查询。现在每当出现错误时,我都会在控制台中得到这个:

C:\xampp\htdocs\projectapp\node_modules\mongodb\lib\mongodb\connection\base.js:246
        throw message;
              ^
TypeError: object is not a function
    at C:\xampp\htdocs\projectapp\node_modules\mongodb\lib\mongodb\collection\query.js:164:5
    at Cursor.nextObject (C:\xampp\htdocs\projectapp\node_modules\mongodb\lib\mongodb\cursor.js:753:5)
    at commandHandler (C:\xampp\htdocs\projectapp\node_modules\mongodb\lib\mongodb\cursor.js:727:14)
    at C:\xampp\htdocs\projectapp\node_modules\mongodb\lib\mongodb\db.js:1899:9
    at Server.Base._callHandler (C:\xampp\htdocs\projectapp\node_modules\mongodb\lib\mongodb\connection\base.js:453:41)
    at C:\xampp\htdocs\projectapp\node_modules\mongodb\lib\mongodb\connection\server.js:481:18
    at MongoReply.parseBody (C:\xampp\htdocs\projectapp\node_modules\mongodb\lib\mongodb\responses\mongo_reply.js:68:5)
    at null.<anonymous> (C:\xampp\htdocs\projectapp\node_modules\mongodb\lib\mongodb\connection\server.js:439:20)
    at emit (events.js:95:17)
    at null.<anonymous> (C:\xampp\htdocs\projectapp\node_modules\mongodb\lib\mongodb\connection\connection_pool.js:201:13)

仅在使用 findOne 查询时收到此错误消息(我现在删除了更新查询,因为我不知道在哪里)

if(sPlayerScore > 190) {
        db.collection("usercollection").findOne({'playerName': sPlayerName, 'playerId': sPlayerID}), function(err, result) {
            if(err)
                throw err;

            console.log("entry saved");
        }}; 

【问题讨论】:

  • 对不起,我想我现在明白了。粘贴时出现问题。
  • 好多了,谢谢。您应该为您的 insertupdate 调用提供回调函数,以便您可以捕获任何错误。 findOne 没有回调来获取结果的目的是什么?
  • 我添加了回调函数,但我的错误消息并没有真正指向我可以修复的区域。似乎我遇到了主要的代码混乱 - 我是否试图用这个功能做一些 Mongo 或 Node 不可能做的事情?再次感谢。

标签: javascript node.js mongodb node-mongodb-native


【解决方案1】:

您的代码到处都是。这应该可以通过简单的 findOneAndUpdate 轻松处理,如果您想创建不存在的播放器,可以选择使用 upsert。

var MongoClient = require('mongodb').MongoClient;

function insertEntry(sPlayerName, sPlayerID, sPlayerScore, sPlayerHealth)
{
  MongoClient.connect('mongodb://127.0.0.1:27017/mdata', function(err, db) {
    if(err) { throw err; }

    var userCollection = db.collection('usercollection');

    var player = {
      playerName: sPlayerName,
      playerId: sPlayerID,
      playerScore: sPlayerScore
    };

    var query = {
      playerName: sPlayerName,
      playerId: sPlayerID
    }

    var sort = {};

    var options = {
      upsert: true;
    }

    userCollection.findAndModify(query, sort, player, options, function(err, doc) {
      if(err) { throw err; }

      // player updated or inserted
    });
  }
}

【讨论】:

  • 蒂莫西,首先我要非常感谢你。您的代码中有一些小的语法错误,但我能够弄清楚。 (至少没有抱怨),第二,如果你能向我解释为什么我的代码不起作用。我有一个大致的了解,但如果你能指出 1 或 2 件主要的事情,我认为这真的会对我有所帮助! (例如——“你的代码到处都是。”)再次感谢你!!!!!!!!!!!!!!!!!!如果我可以投票,我会的。
  • 我会说一件让我感到困惑的大事——为什么我的插入查询有效而我的更新或 findOne 没有?这对我来说毫无意义。我对更新和查找的查询是否错误?
  • 存在许多问题,但我不确定它们是来自您将它们粘贴到问题中还是在原始来源中。如果你把你的整个文件放在一个 pastebin 中(如果你有它们,减去和凭据),我会看看我能找到什么。
  • 例如,上一个示例中的这一行 ` db.collection("usercollection").findOne({'playerName': sPlayerName, 'playerId': sPlayerID}), function(err, result) {` 无效,因为您在传入函数之前关闭了括号。如果您实际使用了该代码,您应该会收到如下信息:SyntaxError: Unexpected token )
  • 是的,这就是我制作的功能。其余代码不是我的——其他人制作了一个套接字 io 游戏,我只是在修改它并边走边学。我没有得到 SyntaxError },我在使用 findOne() 方法时得到了“TypeError:对象不是函数”。 (虽然插入没有问题,这让我很困惑) - 再次感谢!
猜你喜欢
  • 2017-11-18
  • 2016-07-10
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 2012-03-16
相关资源
最近更新 更多