4

我有一个大约 50tags个数组的列表,并且想要搜索我的文档以查找与这些标签匹配的记录。

因为它们是用户提交的并且 mongoDB 区分大小写,所以我将/wildcard/i其用作搜索的一种方式。我知道这不是最快的搜索方式,但我想不出更好的解决方案。

我可以通过两种方式进行查询。第一个是for在我的数组上运行一个循环tags,并对每个结果执行:

db.collection.find({tags: /<tag[x]>/i})

或者,我可以收集所有标签并使用 运行一次查找$or,如下所示:

db.collection.find({$or:[{tags:/<tag1>/i},{tags:/<tag2>/i},{tags:/<tag3>/i}, ... {tags:/<tag50>/i}]});

我已经尝试了这两种方法,发现 using$or明显更快 - 但由于我的应用程序的工作状态,很难判断这是因为它实际上更快还是我的应用程序是否在其他领域造成了大量开销(这是)。

所以为了澄清,在 MongoDB 中执行一次大查询比执行多次小查询快吗?

编辑:另一个例子是查找 3 个单独的记录是否_id比使用{$or:[{_id: ObjectId([id1])},{_id: ObjectId([id2])},{_id: ObjectId([id3])}]}. 是不是更多?

4

1 回答 1

1

我建议您调整架构,使其保持标准化的标签数组。插入新文档时,请执行以下操作:

tags : [ "business", "Computing", "PayPal" ],
lowercaseTags : [ "business", "computing", "paypal" ]

同样,当您更新标签时,更新两个数组。

在 lowercaseTags 上创建索引,然后当您想要查询它们时,使用带有$in运算符的单个查询以及搜索词的规范化形式。

例如,要搜索business iTunes YouTube,请使用以下查询:

db.collection.find( { tags : $in: [ "business", "itunes", "youtube" ] } )

这个答案给出了这种方法的一个例子。它应该比您拥有的加载速度更快。

您可以采取的另一种方法是创建一个文本索引并使用text命令

这两种方法都适用于索引优化,并设计您的模式以与 Mongo 一起工作。收益应该比单个$or查询和 50 个更简单查询之间的差异要高得多。

于 2013-07-30T23:17:08.233 回答