首页 文章

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

提问于
浏览
3

是否可以查询给定字符串中包含特定字段的文档?

例如,如果我有这些文件:

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

我想找到字段 a 完全包含在字符串 "test blabla test" 中的所有文档,所以 only the first document would be returned .

我知道我可以用 aggregation 使用 $indexOfCP 来实现它,并且 $wheremapReduce 也可以 . 如果可以使用标准的MongoDB运算符(例如,$ gt,$ in)在 find 查询中进行,我就会徘徊 .

谢谢 .

2 回答

  • 0

    我可以想到两种方法可以做到这一点:

    选项1

    使用 $where

    db.someCol.find( { $where: function() { return "test blabla test".indexOf(this.a) > -1; } }
    

    Explained: 查找在某个给定字符串中找到字段"a"的值的所有文档 .

    这种方法是通用的,因为您可以运行任何您喜欢的代码,但从性能角度来看,建议较少 . 例如,它无法利用索引 . 阅读完整的$在哪里考虑: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)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?)?$/ } )
    

    Explained: 分解"should-be-contained-within"字符串的组成部分,并与正则表达式的所有子可能性相匹配 .

    对于你的情况,这个选项非常疯狂,但值得注意的是,因为可能存在特定情况(例如有限的命名空间匹配),你不必分解每个字母,而是一些非常有限的预定部分 . 在这种情况下,这个选项仍然可以使用索引,而不会遭受性能限制的$(只要正则表达式的复杂性不超过这个好处:)

  • 1

    您可以使用正则表达式进行搜索 .

    db.company.findOne({"companyname" : {$regex : ".*hello.*"}});
    

相关问题