Node.js 使用MongoDB检查字段是否是较长字符串的子字符串

Node.js 使用MongoDB检查字段是否是较长字符串的子字符串,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我试图找到一种基于字段是否是给定字符串的子字符串来返回文档的方法 我得到了一个原型,它基本上从集合中获取所有内容,然后在代码中执行所需的逻辑。在代码中,我可以通过迭代每个文档,然后基于search.includes(field)返回一个文档来找到我想要的内容。这显然不是一个理想的解决方案,因为获取集合中的每个文档是一个昂贵的操作,无法很好地扩展 我做的下一件事是查看使用MongoDB索引的文本搜索。这种方法可以工作,但即使字段不是搜索的完整子字符串,它也会返回文档 有没有什么方法可以构造一个查询

我试图找到一种基于字段是否是给定字符串的子字符串来返回文档的方法

我得到了一个原型,它基本上从集合中获取所有内容,然后在代码中执行所需的逻辑。在代码中,我可以通过迭代每个文档,然后基于
search.includes(field)
返回一个文档来找到我想要的内容。这显然不是一个理想的解决方案,因为获取集合中的每个文档是一个昂贵的操作,无法很好地扩展

我做的下一件事是查看使用MongoDB索引的文本搜索。这种方法可以工作,但即使字段不是搜索的完整子字符串,它也会返回文档

有没有什么方法可以构造一个查询来检查文档上的字段是否是给定字符串的精确子字符串

例如,这里有三个与我的收藏中的文档类似的文档:

{
    "_id": ObjectId("5b893f36e7e6ab1a88f87b39"),
    "trigger": "hello",
    "response": "World"
}

{
    "_id": ObjectId("5b6ca6169cc009573bbc3571"),
    "trigger": "stackoverflow",
    "response": "Is awesome!"
}

{
    "_id": ObjectId("5b6ca6169cc009573bbc3571"),
    "trigger": "foo bar",
    "response": "barfoo"
}
以下是一些我期望的输出情况:

搜索字符串
stack
stackexchange
不应返回任何文档,因为没有触发器字段是这些字符串的完美子字符串

字符串
hello stackexchange
应该只获取第一个文档,因为触发器字段是搜索字符串的子字符串

字符串
hello stackoverflow
将获取两个文档,因为它们都有一个触发器字段,该字段是搜索字符串的子字符串

编辑:查询还必须处理触发器字段可能包含空格的事实。因此字符串
foo-bar foobar
应该与上一个文档匹配,但是字符串
foo
不应该匹配


非常感谢您的帮助

经过一番尝试和错误,我找到了一种实现我想要的东西的方法。通过在
$gt
中使用
$indexOfBytes
,我可以通过查看
$indexOfBytes
的结果是否大于-1来检查触发器是否作为搜索字符串中的子字符串存在。这是我最后的猫鼬查询:

Collection.find({
    $expr: {
        $gt: [
            {
                $indexOfBytes: [
                    search,
                    "$trigger"
                ]
            },
            -1
        ]
    }
});

你能添加两个示例文档,包括预期结果吗?@Veeram我已经用一些文档和预期行为更新了我的问题。我对查询字符串设计有疑问。如果查询字符串是“foo bar foo foo bar foo”,该怎么办?哪些空格是分隔符,哪些不是?您是否可以使用数组方法进行查询,例如:[“foo-bar”、“foo”、“bar”]?@BuzzMoschetti好的,只要文档的触发器字段是查询字符串的子字符串,它就应该匹配。因此,如果要使用问题中的文档集,您的示例应该生成最后一个文档。理想情况下,查询应将空格视为任何其他字符。我想我可以将查询字符串拆分成一个数组,但我不知道如何将触发器字段与之匹配。