当前位置: 首页 > 知识库问答 >
问题:

我可以确定字符串是否是MongoDB对象ID吗?

戚京
2023-03-14

我通过将字符串转换为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

共有3个答案

颛孙正谊
2023-03-14

如果您使用的是Mongoose,那么我们可以通过在isValidObjectId中使用Mongoose build来测试一个字符串是12字节还是24个十六进制字符。

mongoose.isValidObjectId(string); /* will return true/false */
甄正信
2023-03-14

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

咖啡脚本

if id.match /^[0-9a-fA-F]{24}$/
    # it's an ObjectID
else
    # nope

JavaScript

if (id.match(/^[0-9a-fA-F]{24}$/)) {
    // it's an ObjectID    
} else {
    // nope    
}
阎扬
2023-03-14

我发现猫鼬ObjectId验证器可以验证有效的对象ID,但我发现了一些无效ID被认为有效的情况。(例如:任意12个字符的长字符串)

var ObjectId = require('mongoose').Types.ObjectId;
ObjectId.isValid('microsoft123'); //true
ObjectId.isValid('timtomtamted'); //true
ObjectId.isValid('551137c2f9e1fac808a5f572'); //true

对我来说,有效的方法是将字符串强制转换为objectId,然后检查原始字符串是否与objectId的字符串值匹配。

new ObjectId('timtamtomted'); //616273656e6365576f726b73
new ObjectId('537eed02ed345b2e039652d2') //537eed02ed345b2e039652d2

这是因为有效ID在强制转换为ObjectId时不会更改,但获取false valid的字符串在强制转换为ObjectId时会更改。

 类似资料:
  • 问题内容: 我正在通过将字符串转换为BSON进行MongoDB查找。在转换之前,有没有办法让我确定我拥有的字符串是否是Mongo的有效ObjectID? 这是我当前的findByID函数的脚本。效果很好,但是如果我确定字符串不是ID,我想按其他属性查找。 问题答案: 我发现猫鼬的ObjectId验证程序可用来验证有效的objectId,但我发现了一些无效ID被视为有效的情况。(例如:任意12个字符

  • 问题内容: 我编写了两个简单的函数来确定字符串是否是回文。我以为它们是等效的,但是2不起作用。为什么是这样? 1个 2 问题答案: 不会创建字符串,而是创建“反向”对象: 因此,字符串不等于object 。为了使它起作用,您需要确保实际评估了该对象: 所述插入件在每个字符串中的字符,并且这导致反转串之间正在变成一个字符串对象。

  • 我想解析一些JSON,但一个键要么是字符串,要么是对象。 这是我当前的结构:https://github.com/PhillippOhlandt/pmtoapib/blob/master/CollectionItemRequest.go#L10 在这里,“Url”属性不仅可以是字符串,还可以是对象。 我开始为它创建一个自己的结构,覆盖对象案例。 但是这样字符串版本就不行了。有没有一种方法既能处理这

  • 问题内容: 我必须知道是String还是任何其他类类型,该怎么办?目前,我像下面那样做,但是它的编码不是很好。 问题答案: 是如果对象是或的子类 是仅当对象是一个

  • 问题内容: 我需要能够使用Java中的字符串,并确定其中包含的所有字符是否都在指定的字符集中(例如ISO-8859-1)。我已经到处寻找了一种简单的方法(包括使用来玩),但是还没有找到任何东西。 取得字符串并确定所有字符是否都在给定字符集中的最佳方法是什么? 问题答案: 类CharsetEncoder在包java.nio.charset中提供的方法canEncode是否支持一个特定的字符来测试。

  • 我想使用spring cloud stream api聚合来自主题的事件。因此,我使用kstream作为输入。 现在我想使用聚合器将我的新对象存储在KeyValue存储区中,所以我使用以下代码: 为什么我只能使用字符串作为初始值设定项,不可能使用任何对象? 我错过什么了吗?