mongodb增量编号 – 500内部服务器错误

我正在尝试用节点和mongodb对我的文档的id进行编号。 我得到一个500内部服务器错误:'无法读取属性'seq'null。

//提交一张票 – 这是返回一个500错误 – 不更新ID

router.post('/ticketform', function(req, res){ var db = req.db; function getNextSequence(name, callback){ db.counters.findAndModify( { query:{ _id:name}, update:{$inc:{seq:1} }, new:true }, callback ); } getNextSequence('ticket', function(err, obj) { if (err) console.error(err); db.users.insert( { '_id': obj.seq, 'firstname':req.body.firstname, 'lastname':req.body.lastname, 'email':req.body.email, 'phone':req.body.phone, 'issue':req.body.issue }, function(err,docs) { if (err) console.error(err); console.log(docs); res.end(); }); }); }); 

您似乎正在使用语法与mongodb shell有点不同的节点本机驱动程序。 .findAndModify()函数的工作原理完全不同。

作为一个完整的工作示例,您可以使用该代码以及asynchronous模块的使用,使逻辑看起来更清晰一些:

 var async = require("async"), mongodb = require("mongodb"), MongoClient = mongodb.MongoClient; MongoClient.connect('mongodb://localhost/test',function(err,db) { async.waterfall( [ function(callback) { db.collection("counters").findAndModify( { "_id": "ticket" }, [], { "$inc": { "seq": 1 } }, { "upsert": true, "new": true }, function(err,doc) { callback( err, doc.seq ); } ); }, function(seq, callback) { var doc = { "_id": seq }; db.collection("users").insert( { "_id": seq }, function(err, doc) { callback( err, doc ); } ); } ], function( err, result ) { console.log( result ); } ); }); 

该函数的参数是“查询”,“sorting”,这是一个数组,即使空白也是必需的,然后是“更新”文档,“选项”,你想要返回更新的文档以及“upsert”来创build没有匹配文档的新文档,最后是callback。

asynchronous瀑布允许您“传递”结果,而不用将函数embedded到用于获取序列的方法的callback中。 你不需要这样做,但代码看起来更清洁,直接的目的。

或者,如果要使用在.findOneAndUpdate()具有辅助函数的选项,则可以使用mongoose等选项。 您可能会发现连接pipe理对于该库更容易一些,但是取决于您。

你可能指的是这个教程。 。 在这个例子中,他们展示了在MongoDB shell中的实现,其中findAndModify是同步的。 正如JohnnyHK在评论中指出的,Node.js中的findAndModify是asynchronous的,结果会在callback中返回。

在Node.js中,你可以这样做:

 function getNextSequence(name, callback){ db.counters.findAndModify( { "_id": "ticket" }, [], { "$inc": { "seq": 1 }}, { "new": true, "upsert": true }, callback ); } getNextSequence('ticket', function(err, obj) { if (err) console.error(err); db.users.insert( { '_id': obj.seq, 'firstname':req.body.firstname, 'lastname':req.body.lastname, 'email':req.body.email, 'phone':req.body.phone, 'issue':req.body.issue }, function(err,docs) { if (err) console.error(err); console.log(docs); res.end(); }); }); 

您还应该检查命令的文档以更好地理解选项。