MongoDB从指定版本中抓取最新版本



我的mongodb数据库中有一组测试结果。数据库中的每个文档都包含版本信息、测试数据、日期、测试运行信息等

该版本在文档中被分解并存储为单独的值。例如:{VER_MAJOR:"0",VER_MINOR:"2",VER_REVISION:"3",VER_PATCH:"20"}

我的应用程序希望能够指定一个特定的版本,并获取该文档以及基于该版本的前N个文档。

例如:

如果version = 0.2.3.20n = 5,则结果将返回版本为0.2.3.20, 0.2.3.19, 0.2.3.18, 0.2.3.17, 0.2.3.16, 0.2.3.15的文档

我想到的解决方案是:

  1. 创建一个新数据库,该数据库包含带有版本信息的文档并进行排序。可用于获得之前的N个版本,可用于获得测试结果数据库中相应的N个文档。

  2. 在测试结果数据库中执行排序,如数字1所示。尽管如果测试结果数据库很大,这将需要很长时间。每次也要考虑按顺序插入。

像选项1中那样创建另一个数据库似乎不是正确的方法。但是对测试结果数据库进行排序似乎会有很多开销,我是不是搞错了,我应该担心选项2会产生很多开销?我的印象是,我必须查询整个数据库,然后在应用程序端对其进行排序。查询整个数据库似乎有些过头了。。。

db.collection_name.find().sort([Paramaters for sorting])

您完全正确地认为,对整个数据集进行查询和排序会非常过度。我可能在这件事上做得太过火了,但我试图在下面详细分析一下。

术语

首先,有几个术语上的小毛病。我认为您使用的术语是数据库,而您的意思是使用集合。区分这两个概念将有助于导航文档并更好地理解MongoDB。

集合和排序

其次,重要的是要理解集合中的文档没有固有的顺序。文档返回到应用程序的顺序仅适用于从集合检索文档时,例如在查询中指定.sort()时。这意味着我们不需要将所有文件复制到其他集合中;我们只需要查询数据,以便按照我们想要的顺序只返回所需的数据。

查询

现在进入有趣的部分。查询如下所示:

db.test_results.find({
"VER_MAJOR" : "0",
"VER_MINOR" : "2",
"VER_REVISION" : "3",
"VER_PATCH" : { "$lte" : 20 }
}).sort({
"VER_PATCH" : -1
}).limit(N)

我们的查询在三个前导版本字段上有直接匹配,以将结果限制为仅这些值,即特定版本"0.2.3"。范围$lte过滤器应用于VER_PATCH,因为我们需要多个补丁修订。

然后,我们按VER_PATCH对结果进行排序,以返回按补丁版本降序排列的结果。最后,限制运算符用于限制返回的文档数量。

索引

我们还没有完成!还记得你说过,在应用程序端查询整个集合并对其进行排序感觉有些过头了吗?好吧,如果这个查询不存在索引,那么数据库将执行

在确定索引中字段的顺序时,应遵循相等排序匹配规则。在这种情况下,这将为我们提供索引:

{ "VER_MAJOR" : 1, "VER_MINOR" : 1, "VER_REVISION" : 1, "VER_PATCH" : 1 }

创建此索引将允许查询通过只扫描它将返回的结果来完成,同时避免内存中的排序。更多信息可以在此处找到。

最新更新