MongoDB: 使用变量的文本搜索(精确匹配)
MongoDB: Text search (exact match) using variable
MongoDB3.4
我在变量中有一个值。 val1 = "Fort Minor"
我需要在集合商店(名称字段上有文本索引)中搜索文档为
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}})
它 return 是 _id : 4 文档,因为它包含 Fort。
我需要使用变量进行精确匹配。
只有当 val1 = "Fort Coffee"
时,上面的搜索才应该 return
当您进行文本搜索时,它有许多内部步骤,例如标记您的工作、分析词的最低词干(例如匹配 cooking 和 coocked,因为两者都来自基础工作 "cook")。如果您期望完全匹配,那么您实际上并不是在寻找文本搜索,而是在寻找普通查询。
因此,
如果你这样做:
db.City.find({$text:{$search: "Fort Minor"}})
它将尝试找到所有包含堡垒、次要、少数民族、堡垒等的文件。
如果您执行以下操作:
db.City.find({ name : "Fort Minor"})
如果会给你完全匹配的文件。
然而,问题在于:
如果您搜索所有小写字母,例如:
db.City.find({ name : "fort minor"})
它不会给你你所期待的。
要解决此问题,请使用正则表达式:
db.user.find( { name: /^Fort Minor$/i } );
如果你这样做:
query = {"$search" :"(\"{}\"".format(val1)}
city = db.City.find({"$text": query})
上面的答案实际上没有帮助。我也遇到了同样的问题,我找到了一个解决方案,其中包含 Javascript 的新模板文字。这是解决方案:
const val1 = "Fort Minor"
const val2 = `\"${val1}\"`
myDatabase.find({$text:{$search: val2}})
有关模板文字的更多信息:https://www.w3schools.com/js/js_string_templates.asp
MongoDB3.4
我在变量中有一个值。 val1 = "Fort Minor"
我需要在集合商店(名称字段上有文本索引)中搜索文档为
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}})
它 return 是 _id : 4 文档,因为它包含 Fort。
我需要使用变量进行精确匹配。
只有当 val1 = "Fort Coffee"
时,上面的搜索才应该 return当您进行文本搜索时,它有许多内部步骤,例如标记您的工作、分析词的最低词干(例如匹配 cooking 和 coocked,因为两者都来自基础工作 "cook")。如果您期望完全匹配,那么您实际上并不是在寻找文本搜索,而是在寻找普通查询。
因此,
如果你这样做:
db.City.find({$text:{$search: "Fort Minor"}})
它将尝试找到所有包含堡垒、次要、少数民族、堡垒等的文件。
如果您执行以下操作:
db.City.find({ name : "Fort Minor"})
如果会给你完全匹配的文件。
然而,问题在于:
如果您搜索所有小写字母,例如:
db.City.find({ name : "fort minor"})
它不会给你你所期待的。
要解决此问题,请使用正则表达式:
db.user.find( { name: /^Fort Minor$/i } );
如果你这样做:
query = {"$search" :"(\"{}\"".format(val1)}
city = db.City.find({"$text": query})
上面的答案实际上没有帮助。我也遇到了同样的问题,我找到了一个解决方案,其中包含 Javascript 的新模板文字。这是解决方案:
const val1 = "Fort Minor"
const val2 = `\"${val1}\"`
myDatabase.find({$text:{$search: val2}})
有关模板文字的更多信息:https://www.w3schools.com/js/js_string_templates.asp