【问题标题】:Optimization on excluding some documents from text search result set based on a field's values?基于字段值从文本搜索结果集中排除某些文档的优化?
【发布时间】:2023-03-13 11:44:01
【问题描述】:

在我们的 MongoDB-Node.js-Mongoose 设置中:

我们已经创建了一个text search index,并且我们也可以使用它从集合中找到一个词:

db.sampleCollection.find( { $text: { $search: "wordToSearch" } })

到目前为止,没有任何问题......

我们有一个要求,如果 sampleCollection 中的文档有一个字段 private 设置为 true,那么我们需要从结果集中排除这些文档。

也许我们可以添加这样的东西:

.where({ private: true})

这看起来像是一个额外的调用并且效率不高。有没有更好更快的方法来做到这一点?

【问题讨论】:

  • 类似db.sampleCollection.find( { private: { $ne:true }, $text: { $search: "wordToSearch" } } })
  • @Veeram 谢谢,会检查并更新!!有什么理由证明它更快?

标签: javascript node.js mongodb optimization mongoose


【解决方案1】:

如果您想对 MongoDB 说:“获取所有包含文本 'wordToSearch' 并且具有名为 'private' 的属性不等于 true 的文档”,那么以下查询应该可以工作:

db.sampleCollection.find({ private: { $ne: true }, $text: { $search: "wordToSearch" } })

【讨论】:

  • 酷,它的性能观点有什么理由吗?
  • 来自 MongoDB 网站 (docs.mongodb.com/manual/reference/operator/query/ne):不等式运算符 $ne 的选择性不是很高,因为它经常匹配索引的大部分。因此,在许多情况下,带有索引的 $ne 查询的性能可能不比必须扫描集合中所有文档的 $ne 查询好。所以我想它没有任何性能影响。 (最后一句是我写的:))
  • 这意味着这不是我们想要的。问题是有没有更好更快的方法来做到这一点?
  • 我认为没有更快的方法来做到这一点。查询应该足够快,它只是添加到初始查询中的一个条件,不需要做太多的事情。它不会降低或提高性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 1970-01-01
  • 2012-08-09
  • 2014-02-12
  • 1970-01-01
  • 2013-09-16
  • 2017-03-07
相关资源
最近更新 更多