【问题标题】:MongoDB: Text search (exact match) using variableMongoDB:使用变量的文本搜索(精确匹配)
【发布时间】:2017-10-02 10:08:55
【问题描述】:

MongoDB 3.4

我在变量中有一个值。 val1 = "小堡"

我需要在集合存储(名称字段上带有文本索引)中搜索文档为

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}) 使用这个
  • 但我需要进行文本搜索。
  • 为时已晚,但这可能对某人有所帮助,您只需要在引号下提供搜索文本。 val1 = "\"Fort Coffee\""

标签: mongodb text-search exact-match


【解决方案1】:

当您进行文本搜索时,它有许多内部步骤,例如对您的作品进行标记、分析单词的最低词干(例如,匹配 cook 和 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 } );

【讨论】:

  • 我需要使用一个变量进行比较。我无法对这些值进行硬编码。
  • 您可以通过连接用户变量..这只是一个例子
  • 我可以在文本搜索查询中使用变量吗?
  • 您使用什么类型的驱动程序与 mongodb 通信?或者你想在 mongoshell 中完成这个?
  • 我正在尝试使用 mongoshell。我使用了问题中的命令。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    如果你这样做:

    query = {"$search" :"(\"{}\"".format(val1)}
    city = db.City.find({"$text": query})
    

    【讨论】:

      猜你喜欢
      • 2013-07-27
      • 1970-01-01
      • 2023-03-28
      • 2015-10-09
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      相关资源
      最近更新 更多