传入的参数必须是24个hex字符的string – 我认为是

我有一个方法来根据它的ObjectID在我的数据库中find一个文档:

console.log('id: ' + id + ' type: ' + typeof id); collection.findOne({'_id':new ObjectID(id)}, function(error,doc) { if (error) { callback(error); } else { callback(null, doc); } }); 

当我运行它时,我得到以下错误:

 /myPath/node_modules/monk/node_modules/mongoskin/node_modules/mongodb/lib/mongodb/connection/base.js:245 throw message; ^ Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters at new ObjectID (/myPath/node_modules/mongodb/node_modules/bson/lib/bson/objectid.js:38:11) at /myPath/collectionDriver.js:134:41 

这是指上面的collection.findOne()行。

在调用之前,控制台日志以24个hex字符的string输出id:

 id: "55153a8014829a865bbf700d" type: string 

在此之前,我使用JSON.stringify()将ID从一个对象转换为string,但它似乎成功地运行,如我的console.log所示。

db.myCollection.findOne({_id : ObjectId("55153a8014829a865bbf700d")})运行db.myCollection.findOne({_id : ObjectId("55153a8014829a865bbf700d")})将带来预期的结果。

传入我函数的id在这种情况下已经是一个对象ID,所以不需要从它创build一个新的ObjectID。

当ObjectIDs注销到控制台时,它们显示为hexstring,而不是ObjectID("hexString") ,所以我认为我需要将其转换为执行查找,但它已经在我需要的格式。

尝试ObjectID(id)而不是new ObjectID(id)

在我的情况下,这工作:

 var myId = JSON.parse(req.body.id); collection.findOne({'_id': ObjectID(myId)}, function(error,doc) { if (error) { callback(error); } else { callback(null, doc); } }); 

不要忘记在开头包括:

 var ObjectId = require('mongodb').ObjectID; 

尝试这个:

 var hex = /[0-9A-Fa-f]{6}/g; id = (hex.test(id))? ObjectId(id) : id; collection.findOne({'_id':new ObjectID(id)}, function(error,doc) { if (error) { callback(error); } else { callback(null, doc); } });