Regex 针对ObjectId使用正则表达式查询MongoDB

Regex 针对ObjectId使用正则表达式查询MongoDB,regex,mongodb,Regex,Mongodb,是否可以执行如下查询: db.artigo.find( { _id : ObjectId('520a504a3004bc615fcfcf16') } ) 但是在ObjectId上使用正则表达式呢 例如,在上面的位置上获取包含“004”的_id PS.原因是基于一些字段,即_id,实现一个短服务。我试图创建一个隐式的“短”服务,而不是显式的(为此目的生成一个字段)。这就是您需要的: db.artigo.find({u id:{$regex:'004'}}) ObjectId不是字符串,而是Mon

是否可以执行如下查询:

db.artigo.find( { _id : ObjectId('520a504a3004bc615fcfcf16') } )
但是在ObjectId上使用正则表达式呢

例如,在上面的位置上获取包含“004”的_id

PS.原因是基于一些字段,即_id,实现一个短服务。我试图创建一个隐式的“短”服务,而不是显式的(为此目的生成一个字段)。

这就是您需要的:

db.artigo.find({u id:{$regex:'004'}})
  • ObjectId不是字符串,而是MongoDB中的特殊类型。您可以
    使用正则表达式运算符对包含 ObjectId's
  • 但是_id不必是ObjectId,因此我建议您提供自己的唯一字符串作为_id,然后您可以使用正则表达式
    用于查询的表达式

    • 我认为这是mongodb缺乏的领域之一;而且团队@mongodb看起来也不会像这个()jira问题所表明的那样支持这个特性。 争论似乎是使用我们自己的字符串格式的id,但ObjectID在拥有大量事务的大型系统中是有意义的,例如Amazon订单号

      我想到的解决方案如下:


      我创建了另一个列,它复制我的_id字段的前六位数字,并且是字符串类型。我选择my_id字段前6位数字的原因是:;一个是为了节省空间和紧凑,另一个是在一天结束时,我需要一个正则表达式的原因是为了搜索,它非常适合我的需要。

      ObjectId不是字符串,而是MongoDB中的一种特殊类型。你不能 对包含ObjectId的字段使用正则表达式运算符进行查询

      \u id不必是ObjectId,因此我建议您提供自己独特的字符串作为\u id,然后您可以使用正则表达式 用于查询的表达式

      例如:

      let userId = 'bf44fa';
      
      const result = await Users.aggregate([
        {
          $addFields: {
            tempUserId: { $toString: '$_id' },
          }
        },
        {
          $match: {
            tempUserId: { $regex: userId, $options: "i" }
          }
        }
      ]).exec();
      

      现在我们可以通过\u id查找最后6位数字,或者根据您的意愿使用聚合来查找开始6位数字。

      @LuísSoares:语法是正确的,所以我不知道为什么它不适合您。文档如下:问题在于_id不是字符串。这是一个ObjectId,如屏幕截图所示:\@LuísSoares:啊,现在我明白你的问题了。ObjectId有一个“str”属性,它只返回字符串十六进制。你可以对它执行$regex匹配吗?不,你不能这样做。ObjectId.toString()只能在从db检索到字符串后才能将其转换为字符串。我不确定为什么有人标记了这个…可能只是代码?以防万一,如果您更新它,请尝试在代码块之外添加更多的内容。Mongo
      \u id
      是objectId而不是字符串检查此hmm。。我避免了一个额外的字段和一个脚本来创建它。。。谢谢:)您可以通过将a字符串指定给_id来避免额外字段。mongoDB可以为您生成此字段。不确定我是否得到了它。查询是什么样子的?该查询看起来类似于Brian建议的db.artigo.find({{u id:{$regex:any\u valid{u js_regex_exp}}),但只有在_id字段中存储了一个字符串时它才会工作。您可以在mongo中使用x=new ObjectId()生成ObjectId,然后将其转换为字符串x.toString()在数据库中保存文档之前。请记住,除非从字符串(“^xxxxx”)的开头开始查找,否则mongoDB中的正则表达式查询速度很慢,但我有数百万个文档没有以这种方式保存。