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
是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中的正则表达式查询速度很慢,但我有数百万个文档没有以这种方式保存。\u id
- 但是_id不必是ObjectId,因此我建议您提供自己的唯一字符串作为_id,然后您可以使用正则表达式