MongoDB: 使用变量进行文本搜索(精确匹配)

5

MongoDB 3.4

我有一个变量val1 = "Fort Minor"。

我需要在一个名为stores的集合中搜索(该集合在name字段上具有文本索引),其中包含以下文档:

db.stores.insert([
     { _id: 1, name: "Java Hut", description: "Coffee and cakes" },
     { _id: 2, name: "Burger Buns", description: "Gourmet hamburgers" },
     { _id: 3, name: "Coffee Shop", description: "Just coffee" },
     { _id: 4, name: "Fort Coffee", description: "Discount clothing" },
     { _id: 5, name: "Java Shopping", description: "Indonesian goods" }
])

当我使用变量进行集合文本搜索时
db.City.find({$text:{$search: val1}})

它返回了_id为4的文档,因为它包含Fort。

我需要进行精确匹配,但是要使用变量。

上面的搜索应该仅在val1 =“Fort Coffee”时返回。


请使用 db.City.find({name:val1}) 进行查询。 - Love-Kesh
但我需要进行文本搜索。 - Chakraborty
3
虽然已经有点晚了,但这可能对某些人很有帮助,您只需在引号中提供搜索文本。val1 = ""Fort Coffee"" <--- 在引号内进行了转义 db.City.find({$text:{$search: val1}}) - Mohit Sharma
3个回答

13

当你进行文本搜索时,它有许多内部步骤,例如将你的文本标记化、分析单词的最低词干(例如将 "cooking" 和 "cooked" 都视为基本词 "cook" 的派生词以进行匹配)。如果你期望进行精确匹配,实际上你并不是在进行文本搜索,而是在进行普通查询。

因此,

如果你这样做:

db.City.find({$text:{$search: "Fort Minor"}})

它将尝试查找所有包含 fort、minor、minority、forting 等单词的文档。

如果您执行以下操作:

db.City.find({ name : "Fort Minor"})

我会给你一份完全匹配的文件。

然而,这里有个问题:

如果你搜索所有小写字母,如下:

db.City.find({ name : "fort minor"})

它不会给你你所期望的。

为了解决这个问题,使用正则表达式 :

db.user.find( { name: /^Fort Minor$/i } );

我需要使用一个变量进行比较,不能硬编码数值。 - Chakraborty
你可以通过连接使用变量.. 这只是一个例子。 - Mihir Bhende
我可以在文本搜索查询中使用变量吗? - Chakraborty
你正在使用哪种驱动程序与mongodb通信?或者你想在mongoshell中完成这个任务吗? - Mihir Bhende
你可以使用简单的加号作为连接运算符。 - Mihir Bhende
显示剩余2条评论

5

上面的回答实际上没有帮助。我也遇到了同样的问题,但是我使用了JavaScript的新模板字面量找到了解决方案。这就是解决方案:

const val1 = "Fort Minor"
const val2 = `\"${val1}\"`
myDatabase.find({$text:{$search: val2}})

欲了解有关模板文字的更多信息,请访问:https://www.w3schools.com/js/js_string_templates.asp


感谢回复,同样适用于pymongo。collection.find({"$text": {"$search": f""{word}""}}) - Rohola Zandie

-1
如果你这样做:
query = {"$search" :"(\"{}\"".format(val1)}
city = db.City.find({"$text": query})

我认为在您的搜索值(在第一个转义引号之前)的开头有一个多余的括号。 - Matthew Read

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