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

Cha*_*rty 2 text-search mongodb exact-match

MongoDB 3.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" }
])
Run Code Online (Sandbox Code Playgroud)


当我使用变量文本搜索集合时

db.City.find({$text:{$search: val1}})
Run Code Online (Sandbox Code Playgroud)

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

我需要做一个完全匹配但使用变量。

上面的搜索应该只在 val1 = "Fort Coffee" 时返回

Mih*_*nde 7

当您进行文本搜索时,它有许多内部步骤,例如标记您的工作,分析单词的最低词干(例如匹配cooking 和coocked,因为两者都源自基本工作“cook”)。如果您期望完全匹配,那么您实际上并不是在寻找文本搜索,而是在寻找普通查询。

因此,

如果你这样做:

db.City.find({$text:{$search: "Fort Minor"}})
Run Code Online (Sandbox Code Playgroud)

它将尝试找到所有包含堡垒、次要、少数、堡垒等的文件。

如果你在下面做:

db.City.find({ name : "Fort Minor"})
Run Code Online (Sandbox Code Playgroud)

如果会给你完全匹配的文件。

但是,这里有一个问题:

如果您搜索所有小写字母,例如:

db.City.find({ name : "fort minor"})
Run Code Online (Sandbox Code Playgroud)

它不会给你你所期待的。

要解决此问题,请使用正则表达式:

db.user.find( { name: /^Fort Minor$/i } );
Run Code Online (Sandbox Code Playgroud)


Abd*_*kim 6

上面的答案实际上没有帮助。我也遇到了同样的问题,我找到了一个使用新的 Javascript 模板文字的解决方案。这是解决方案:

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

有关模板文字的更多信息:https ://www.w3schools.com/js/js_string_templates.asp