MongoDB - 查找给定字符串中是否包含字段值

3

能否查询包含特定字段的文档?

例如,如果我有以下文档:

{a: 'test blabla'},
{a: 'test not'}

我想查找所有字段a完全包含在字符串"test blabla test"中的文档,因此只有第一个文档会被返回
我知道可以使用aggregation$indexOfCP来实现,也可以使用$wheremapReduce来实现。我想知道是否可以使用标准的MongoDB操作符(例如$gt、$in)在find查询中实现。
谢谢。

{a: 'test'} 也完全包含在 "test blabla test" 中。您是否正在寻找最接近的匹配? - s7vr
@Veeram 对不起,我修复了这些文件。(对我来说也很混乱哈哈) - TomG
1
这个功能请求仍然是开放的 https://jira.mongodb.org/browse/SERVER-13902 - JohnnyHK
3个回答

1
我可以想到两种方法来实现这个:

选项1

使用$where

db.someCol.find( { $where: function() { return "test blabla test".indexOf(this.a) > -1; } }
解释:查找所有其字段“a”的值在某个给定字符串中出现的文档。

这种方法是通用的,因为你可以运行任何你喜欢的代码,但从性能的角度来看不太建议使用。例如,它不能利用索引。阅读完整的$where注意事项请参考此处:https://docs.mongodb.com/manual/reference/operator/query/where/#considerations

选项2

使用正则表达式匹配技巧,仅在特定情况下使用;以下是一个示例,只适用于匹配字段值作为给定字符串的起始子字符串的情况:

db.someCol.find( { a : /^(t(e(s(t( (b(l(a(b(l(a( (t(e(s(t)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?$/ } )
解释: 将“应该包含在”字符串的组件拆分并使用正则表达式匹配所有子可能性。
对于您的情况,这个选项几乎是不可行的,但值得注意的是,可能存在特定情况(例如有限的命名空间匹配),您不必拆分每个字母,而是一些非常有限的预定部分。在这种情况下,此选项仍然可以利用索引,并且不会遭受$where性能惩罚(只要正则表达式的复杂度不超过该效益 :)

谢谢,但正如我在问题中所说的,我知道可以使用$where和一些其他可能性来实现。我想知道是否可以使用标准的MongoDB运算符来实现。 - TomG
是的,这是选项2的一个变体,适用于特定情况。否则,可能会在未来考虑JohnnyHK提出的功能请求。祝好运! - Ciabaros

0
如果你使用的是Mongo v3.6+,你可以使用$expr
正如你提到的$indexOfCP可用于获取索引,在这里它将是:
{ 
   "$expr": {
       {$ne : [{$indexOfCP: ["test blabla test", "$a"]}, -1]}
   }
} 

字段名称应以美元符号($)为前缀,因为$expr允许聚合管道中的过滤器

0
你可以使用正则表达式进行搜索。
db.company.findOne({"companyname" : {$regex : ".*hello.*"}});

1
如果字符串包含在字段中,那么这是另一种情况。 - TomG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接