【问题标题】:Find all Mongo document with array containing all search terms查找包含所有搜索词的数组的所有 Mongo 文档
【发布时间】:2014-11-26 07:56:06
【问题描述】:

我有一组包含搜索词数组的文档,例如

[ "apples", "oranges", "bananas" ]

用户将输入关键字前缀的搜索字符串,我想匹配包含数组中每个术语的所有文档。因此,例如,“app oranges”会匹配上面的列表,但“applet oranges”不会。

使用 $regex 构造一个 $and 查询来检查每个词是否匹配数组中的一项作为前缀是相当简单的,但这还远远不够......

每个关键字在集合中都应该有一个唯一的匹配项,这样搜索“apples app”就不会匹配上面的列表,因为“app”这个词不能与“apple”匹配,因为“apple”已经被匹配了。这种约束导致了一个更微妙的问题。以这一套为例:

[ "france", "fred", "freddy" ]

如果用户点击“fr France”,那么这应该匹配。重要的是,“fr”的匹配不会从剩余关键字的可能术语列表中删除“france”,否则随后对术语“france”的测试将失败。

我需要将其实现为 Mongo 查询。我对 Mongo 很陌生,我不知道从哪里开始,甚至这是可能的。可以做到吗?如果有,怎么做?

【问题讨论】:

  • 如果您可以接受可能发生多个匹配的事实:阵列上的text index 怎么样?你可以按照他们达到的分数对结果进行排序,有自动词干等等。当然,它会有点模糊。由于您没有描述您的用例,因此很难判断文本索引是否符合您的需求。

标签: mongodb


【解决方案1】:

首先,您可以使用$regex 运算符来匹配文本模式:

var searchTerms = "app oranges".split(" ");
var arr = [];
searchTerms.forEach(function(i){
var reg = new RegExp("^"+i);
arr.push({"names":{$regex:reg}});
})
db.collection.find({$and:arr});

将为您提供数组names 包含以app 开头并包含oranges 的值的文档。

每个关键字在集合中都应该有一个唯一的匹配项,这样搜索“apples app”就不会匹配上面的列表,因为“app” 术语不能与“apple”匹配,因为“apple”已经 匹配。这种约束导致了一个更微妙的问题。拿下这套 例如:

此逻辑应在触发查询之前/之后在应用程序服务器中执行。如果用户输入的字符串是另一个 former 输入的 substring,那么查询肯定会失败,因为它已经匹配了 fromer。

【讨论】:

  • 这并不能解决问题的核心。我已经更新了我的问题以使其更清楚。
  • 没有。如果用户输入“app apples”,那么它应该匹配一个像 ["apples", "application"] 这样的数组,但它不应该匹配 ["apples", "orange"]
  • apples 不是apple 的前缀。所以第一种情况不匹配。
  • 那只是一个错字。固定。
  • 您的答案将构造 { $and: [ {"names": { $regEx: "^apples" }}, {"names": { $regEx: "^app" }} ]。这 匹配 [ "apples", "oranges" ],因为两个正则表达式都匹配 "apples"。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 2022-01-17
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多