传入的参数必须是24个十六进制字符的字符串 - 我认为是

Car*_*sel 7 mongodb node.js monk

我有一种方法可以根据ObjectID在我的数据库中查找文档:

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

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

/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
Run Code Online (Sandbox Code Playgroud)

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

我在调用之前的控制台日志输出id为24个十六进制字符的字符串:

id: "55153a8014829a865bbf700d" type: string
Run Code Online (Sandbox Code Playgroud)

在此之前,我将id从一个对象转换为一个字符串,JSON.stringify()但它似乎成功运行,如我的console.log所示.

db.myCollection.findOne({_id : ObjectId("55153a8014829a865bbf700d")})在Robomongo中运行会带来预期的结果.

Car*_*sel 13

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

当ObjectID被注销到控制台时,它们显示为十六进制字符串,而不是ObjectID("hexString"),所以我认为我需要转换它来执行查找,但它已经是我需要的格式.


小智 5

尝试这个:

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);
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 这个答案出现在低质量审查队列中,大概是因为您没有提供任何代码解释。如果此代码回答了问题,请考虑在答案中添加一些解释代码的文本。这样,您更有可能获得更多赞——并帮助提问者学习新知识。 (9认同)