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

时间:2015-04-10 18:27:00

标签: regex mongodb

是否可以进行如下查询:

db.artigo.find( { _id : ObjectId('520a504a3004bc615fcfcf16') } )

但在ObjectId上使用正则表达式?

例如,请获取包含" 004"的_ids。在上面那个位置上。

PS。原因是基于某些字段实现了一个简短的服务,即_id。我试图创造一个隐含的" shorty"服务而不是明确的服务(为此目的生成一个字段)。

4 个答案:

答案 0 :(得分:3)

  • ObjectId不是字符串,而是MongoDB中的特殊类型。你可以
    使用正则表达式运算符查询包含的字段 的ObjectId' S。
  • 但是...... _id并不一定是ObjectId,所以我建议你提供自己独特的字符串作为_id然后就可以使用正则表达式了 用于查询的表达式。

答案 1 :(得分:2)

ObjectId 不是字符串而是 MongoDB 中的特殊类型。你不能 使用 regex 表达式 运算符查询包含 ObjectId 的字段。

_id 不必是 ObjectId,所以我建议提供您自己独特的 string 作为 _id 然后你可以使用正则表达式 查询表达式。

示例:

let userId = 'bf44fa';

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

现在我们可以通过 _id 找到最后 6 位或根据您的需要使用聚合从 6 位开始。

答案 2 :(得分:1)

我相信这是mongodb缺乏的领域之一;而且@mongodb团队看起来似乎不支持这个功能,因为这个(https://jira.mongodb.org/browse/SERVER-1146)jira问题表明了这一点。 这个论点似乎是使用我们自己的字符串格式的id,但objectIds在你有大量事务的大系统中是有意义的,例如亚马逊订购号码

我提出的解决方案如下:

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

答案 3 :(得分:-1)

这就是你需要的:

db.artigo.find( { _id : { $regex: '004' } } )