Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在MongoDB中通过各种标准高效地查找文档?_Node.js_Mongodb_Mongodb Query - Fatal编程技术网

Node.js 如何在MongoDB中通过各种标准高效地查找文档?

Node.js 如何在MongoDB中通过各种标准高效地查找文档?,node.js,mongodb,mongodb-query,Node.js,Mongodb,Mongodb Query,我有一本书,里面的文件像 { "title": "The book", "author": "Joe Bob", "tags": ["dogs", "funny", "race"], "categories": ["fiction", "adventure"

我有一本书,里面的文件像

{
   "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多个这样的文档的最佳方式吗?或者我应该更喜欢聚合。

正如您所指出的,您已经基本解决了这个问题,除了那些数组的不区分大小写的情况之外,我稍后将讨论这些数组

首先,我建议您继续搜索所有字段。然而,如果您想坚持您的方法,这也是完全有效的,下面是我将如何更改您的查询

由于数组的匹配方式与字符串的匹配方式相同,因此根本不需要使用
$in
运算符。因此,使那些
类别
标记
搜索不区分大小写是一件小事。假设我们正在寻找“Mark”,那么在
类别中任何与“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"
      }
    },
    
  ]
})

这里有一个例子供您测试。

正如您所指出的,您已经基本解决了这个问题,除了那些数组的不敏感情况,我将在稍后讨论

首先,我建议您继续搜索所有字段。然而,如果您想坚持您的方法,这也是完全有效的,下面是我将如何更改您的查询

由于数组的匹配方式与字符串的匹配方式相同,因此根本不需要使用
$in
运算符。因此,使那些
类别
标记
搜索不区分大小写是一件小事。假设我们正在寻找“Mark”,那么在
类别中任何与“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"
      }
    },
    
  ]
})

这是一个供您测试的示例。

查看-因为您正在搜索所有字段。您可以使用:
{'tags':{$elemMatch:{$regex:search,$options:'i'}}
通过regext在数组中搜索查看-因为您正在搜索所有字段。您可以使用:
{'tags':{$elemMatch:{$regex:search,$options:'i'}
按regex在数组中搜索