1

我在一个集合中有大约 200,000 个文档,如下所示:

{
 "_id": "tdhABqSZPEZ2fFcEzOVCb-q8d",
 "user": "testuser",
 "content": "Test Content"
}

我有一个包含约 50,000 个条目的数组:

let arr = ["tree", "apple", "test", "orange", ...otherEntries] // ~ 50,000 entries

我想获取数组的任何元素在content值中的所有文档,不区分大小写,以便返回上面的示例文档,因为在数组中是test并且在文档的内容中是Test

这可以使用$where然后使用 JavaScript 表达式来工作,但这不是很快。是否有一种非常快速的方法(< 1-2 秒)可以进行这样的查询,或者您对如何重组可以执行这样的快速查询的文档有任何想法?

4

1 回答 1

2
  • 如果您 list(arr) 很小 => 您可以使用创建一个索引并使用$in和过滤(但它不小)

  • 如果您想要区分大小写 => 您可以将列表设为集合并 $lookup 使用索引(但您希望不区分大小写)

如果您有很大的列表,并且您希望不区分大小写

  • 将列表加入一个大字符串(让我们将MyListString其命名为驱动程序中的变量),用空格分隔,例如 ["hat" "tree"] 成为 "hat tree"

  • 在内容上创建文本索引非常容易,例如在 Java 中我确实mycoll.createIndex(Indexes.text("content"));看到了有关如何创建文本索引的驱动程序文档。

  • 使用匹配进行查找或聚合(MyListString 是上面的大字符串变量)(默认情况下,这是不区分大小写的匹配)

    { "$match" { "$text" { "$search" MyListString} } }

在我的基准测试中时间小于 1 秒,测试一下,我想你会没事的。

于 2021-08-21T14:38:28.023 回答