【问题标题】:How to efficiently find documents by various criteria in MongoDB?如何在 MongoDB 中按各种标准高效查找文档?
【发布时间】:2021-05-07 06:28:42
【问题描述】:

我有一系列书籍,其中的文档布局类似于

{
   "title": "The book",
   "author": "Joe Bob",
   "tags": ["dogs", "funny", "race"],
   "categories": ["fiction", "adventure"]
}

我想使用一个搜索栏根据这些条件中的任何一个来查找一本书。大多数情况下我已经把它记下来了,但我现在不明白它是我应该使用的搜索还是聚合。我也希望我可以让所有内容都不区分大小写,但我不知道如何使用$in 运算符执行类似于$options: 'i' 的操作。

$or : [
    {'title': {$regex: search, $options: 'i'}},
    {'author': {$regex: search, $options: 'i'}},
    {'tags': {$in: [search]}},
    {'categories': {$in: [search]}},
]

这是我搜索 100 多个此类文档的最佳方式吗?或者我应该更喜欢聚合。

【问题讨论】:

  • 看看Text Search - 因为您正在搜索所有字段。
  • 您可以使用:{'tags': { $elemMatch: { $regex: search, $options: 'i' } }通过正则表达式在数组中搜索

标签: node.js mongodb mongodb-query


【解决方案1】:

正如您所指出的,您已经大致了解了这件事,除了那些不区分大小写的数组,我稍后会谈到。

首先,我建议您关注this approach 搜索所有字段。但是,如果你想坚持你的方法,这也是完全有效的,我将如何改变你的查询。

由于数组的匹配方式与字符串的匹配方式相同,因此您根本不需要 $in 运算符。所以让categoriestags 搜索不区分大小写是一件小事。假设我们正在寻找“Mark”,那么categories 中任何带有“marketing”的内容都应该被选中。方法如下:

db.collection.find({
  $or: [
    {
      "title": {
        $regex: "Mark",
        $options: "i"
      }
    },
    {
      "author": {
        $regex: "Mark",
        $options: "i"
      }
    },
    {
      "tags": {
        $regex: "Mark",
        $options: "i"
      }
    },
    {
      "categories": {
        $regex: "Mark",
        $options: "i"
      }
    },
    
  ]
})

这里有一个Playground example 供你测试。

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 2021-11-20
    • 2021-05-23
    • 2021-07-01
    • 2017-04-15
    • 2020-07-27
    • 2011-03-20
    • 2015-05-03
    • 2021-07-05
    相关资源
    最近更新 更多