如何在MongoDB中通过各种条件高效地查找文档?

28 浏览
0 Comments

如何在MongoDB中通过各种条件高效地查找文档?

我有一系列的图书文件,格式如下:

{

"title": "这本书",

"author": "乔·鲍勃",

"tags": ["狗", "搞笑", "竞赛"],

"categories": ["小说", "冒险"]

}

我想使用一个搜索栏根据任何标准找到一本书。我大部分都已经做到了,但我现在不确定我应该使用搜索还是聚合。我还希望所有的搜索都不区分大小写,但我无法弄清楚如何在$in操作符中使用类似$options: 'i'的东西。

$or: [

{'title': {$regex: search, $options: 'i'}},

{'author': {$regex: search, $options: 'i'}},

{'tags': {$in: [search]}},

{'categories': {$in: [search]}},

]

这是我在类似这样的数百个文档中搜索的最佳方式吗?还是我应该更倾向于使用聚合?

0
0 Comments

在MongoDB中高效地根据各种条件查找文档的方法是一个常见的问题。有些情况下,我们需要对数组进行大小写不敏感的搜索。下面将介绍解决这个问题的原因和方法。

首先,建议遵循一个方法来搜索所有字段,你可以参考这个方法。然而,如果你想继续使用自己的方法,也是完全有效的,下面是我会如何修改你的查询。

由于数组和字符串的匹配方式是相同的,因此在那里你实际上根本不需要$in操作符。所以将那些categoriestags的搜索变成大小写不敏感是一个微不足道的问题。例如,假设我们要查找"Mark",那么任何包含"marketing"的categories都应该被匹配到。下面是实现方法:

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示例中测试这个方法。

0