Mongodb 如何在mongo db中使用大型$in数据集执行查询

Mongodb 如何在mongo db中使用大型$in数据集执行查询,mongodb,optimization,Mongodb,Optimization,我有这样一个简单的查询:{“field”:{$nin:[“value1”、“value2”、“valueN”]} 问题是要排除大量的唯一值(使用$nin运算符)。要过滤的唯一值约为50000,查询长度约为1Kb 问题:有没有优雅、高效的方法来进行此类操作 示例。 收集daily_stat,文档数量56M。每天增加10万份文档的收集量。文档示例 { “日期”:“2020-04-15”, “用户名”:“uniq_名称”, “总数”:12 345 } 我运行下一个查询: { "date": "2

我有这样一个简单的查询:
{“field”:{$nin:[“value1”、“value2”、“valueN”]}

问题是要排除大量的唯一值(使用
$nin
运算符)。要过滤的唯一值约为50000,查询长度约为1Kb

问题:有没有优雅、高效的方法来进行此类操作

示例。 收集
daily_stat
,文档数量56M。每天增加10万份文档的收集量。文档示例

{
“日期”:“2020-04-15”,
“用户名”:“uniq_名称”,
“总数”:12 345
}
我运行下一个查询:

{
  "date": "2020-04-15",
  "username": {
    $nin: [
      "name1",
      "name2",
      "...",
      "name50000"
    ]
  }
}

MongoDB版本:3.6.12

我想说大的
$nin
数组是一个优雅的解决方案。如果
字段
上有一个索引,那么它也将被执行——但仅限于快速排除那些不在光标中返回的文档。比如说,如果一个集合中有1000万个文档,并且您执行了
find()
以排除50000个文档,那么您仍然在将9950000个记录从数据库中拖出并跨线拖出;这是非常重要的。

如果您可以在传入的值中找到一种模式,您可以尝试使用regex。下面给出的例子

db.persons.find({'field':{$nin:[/san/i]}},{_id:0,"field":1})
有关正则表达式的更多详细信息,请参阅


所以您想在输入查询中传入50k值,并获取没有这些值的文档?你能不能再详细一点,比如你的数据是什么样子的,你想实现什么样的功能……确切地说。在输入查询中传入50k值。我不确定我是否能提供更多的细节,因为功能如此简单。让它成为我需要从我的收藏中排除5万个被禁止的IP的任务,就像你的方法是优雅的一样。您有50K个要排除的东西,可以将它们打包到一个50K长的数组中。只要查询本身的大小小于16M,并且您在
字段上有一个索引,那么您就可以了。我只是在一个1000万文档的集合上尝试了这个方法,提取不属于排除的9.95m记录需要更长的时间;可以定义数组变量并在查询中使用。收藏中有多少文件?什么是MongoDB版本?您在查询的筛选器字段上有索引吗?除了您指定的查询条件外,还有其他查询条件吗?您是否使用
解释(“executionStats”)
生成了查询计划?请分享这些信息。谢谢回复。实际上,我目前没有性能问题。我正在寻找优雅的方式做这样的操作。查询需要200毫秒才能完成,现在对我来说可以了。但我可以猜测,随着要排除的项目的增加,性能会逐渐下降。想再次澄清这一点吗>,但只有在快速排除这些文档方面,您才能提供示例,这意味着什么?我将更新我的问题以添加更多详细信息您希望返回的记录占集合总大小的百分比越多,那么性能就越不取决于数据库索引和速度,而取决于网络上的更多信息。极端例子:从10米中排除5件东西。你甚至不需要数据库。另一个极端:从10米处只取5件东西。现在您需要一个index.ahh,就这么简单。我只关心mongo服务器解析和处理大型查询的性能。我接受你的回答,谢谢!很好,但我有所有唯一的值,所以不能有模式匹配