我可以确定字符串是否是MongoDB ObjectID吗?

Wil*_*ill 63 javascript mongodb node.js coffeescript express

我通过将字符串转换为BSON来进行MongoDB查找.在进行转换之前,有没有办法让我确定我拥有的字符串是否是Mongo的有效ObjectID?

这是我当前findByID函数的coffeescript.它工作得很好,但如果我确定字符串不是ID,我想通过不同的属性进行查找.

db.collection "pages", (err, collection) ->
  collection.findOne
    _id: new BSON.ObjectID(id)
  , (err, item) ->
    if item
      res.send item
    else
      res.send 404
Run Code Online (Sandbox Code Playgroud)

小智 101

我发现mongoose ObjectId验证器用于验证有效的objectIds,但我发现了一些无效ID被认为有效的情况.(例如:任何12个字符长的字符串)

var ObjectId = require('mongoose').Types.ObjectId;
ObjectId.isValid('microsoft123'); //true
ObjectId.isValid('timtomtamted'); //true
ObjectId.isValid('551137c2f9e1fac808a5f572'); //true
Run Code Online (Sandbox Code Playgroud)

对我有用的是将一个字符串转换为objectId,然后检查原始字符串是否与objectId的字符串值匹配.

new ObjectId('timtamtomted'); //616273656e6365576f726b73
new ObjectId('537eed02ed345b2e039652d2') //537eed02ed345b2e039652d2
Run Code Online (Sandbox Code Playgroud)

这项工作是因为有效ID在转换为ObjectId时不会更改,但获取false有效的字符串在转换为objectId时会更改.

  • @marcvander 让我 `es6` 为您证明:`isObjectIdValid = id => ObjectId.isValid(id) ?字符串(新的ObjectId(id)=== id)?真:假:假;` (3认同)
  • 现在存在标准函数(isValidObjectId),请在此处检查我的答案 - /sf/answers/4324596461/ (3认同)
  • 那么,像这样的事情?```function checkObjectIdValid(id){ if(ObjectID.isValid(id)){ if(new ObjectID(id) === id){ return true } else { return false } } else { return false } }``` (2认同)
  • 实际上@JacksonVaughan 的答案几乎是正确的。由于我们正在将新的 ObjectID(id) 与另一个字符串进行比较,因此缺少 String() 将新的 ObjectID(id) 转换为字符串。这是完整的正确答案:`const ObjectId = require('mongoose').Types.ObjectId; function isObjectIdValid(id) { if (ObjectId.isValid(id)) { if (String(new ObjectId(id)) === id) { return true } else { return false } } else { return false } }` (2认同)

Joh*_*yHK 67

您可以使用正则表达式来测试:

CoffeeScript的

if id.match /^[0-9a-fA-F]{24}$/
    # it's an ObjectID
else
    # nope
Run Code Online (Sandbox Code Playgroud)

JavaScript的

if (id.match(/^[0-9a-fA-F]{24}$/)) {
    // it's an ObjectID    
} else {
    // nope    
}
Run Code Online (Sandbox Code Playgroud)

  • @Sammaye但这是一个有效的ObjectID,所以它应该匹配. (12认同)
  • @Sammaye与[BSON ObjectID构造函数](https://github.com/mongodb/js-bson/blob/master/lib/bson/objectid.js#L15)使用的验证相同.你能给我一个它会匹配的非ObjectID字符串的例子吗? (2认同)
  • 可能是正确的方法,由猫鼬官方建议 https://github.com/Automattic/mongoose/issues/1959#issuecomment-97457325 (2认同)

Som*_*ial 43

? isValidObjectId()内置解决方案> Mongoose 5.7.12

如果使用的是猫鼬,我们可以测试一个字符串是否是12个字节或使用的24个十六进制字符字符串猫鼬内建 isValidObjectId

mongoose.isValidObjectId(string); /* will return true/false */
Run Code Online (Sandbox Code Playgroud)

  • 说真的,让我们对这件事进行投票。当图书馆不提供支持时,旧的接受的答案很棒,但现在它提供了。绕过它是一种取决于实现细节的黑客行为。 (2认同)

cba*_*rri 8

我过去曾使用本机节点mongodb驱动程序执行此操作.isValid方法检查该值是否为有效的BSON ObjectId.请参阅此处的文档.

var ObjectID = require('mongodb').ObjectID;
console.log( ObjectID.isValid(12345) );
Run Code Online (Sandbox Code Playgroud)

  • 我认为这很可能是因为它应该是“ObjectId”,而不是“ObjectID”。:) (3认同)
  • 这应该被接受的答案,不需要猫鼬 (2认同)

小智 5

如果字符串包含 12 个字母,mongoose.Types.ObjectId.isValid(string) 总是返回 True

let firstUserID = '5b360fdea392d731829ded18';
let secondUserID = 'aaaaaaaaaaaa';

console.log(mongoose.Types.ObjectId.isValid(firstUserID)); // true
console.log(mongoose.Types.ObjectId.isValid(secondUserID)); // true

let checkForValidMongoDbID = new RegExp("^[0-9a-fA-F]{24}$");
console.log(checkForValidMongoDbID.test(firstUserID)); // true
console.log(checkForValidMongoDbID.test(secondUserID)); // false
Run Code Online (Sandbox Code Playgroud)