[英]Can't get MongoDB update query to work in Node.JS
我已经阅读过文档,教程和SO。 我只是找不到关于如何正确更新数据库中已有条目的正确答案。
我可以很好地插入数据,但是第二次尝试使用以下查询更新数据,但失败。 某种程度上说是错误的,但我无法弄清楚。 我从文档,tut等中复制了副本。
我的插入内容正常,因此不会出现连接问题。
这是我的更新代码
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");
}};
您的代码无处不在。 应该使用简单的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
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.