我在mongodb数据库中有一组测试结果。数据库中的每个文档都包含版本信息、测试数据、日期、测试运行信息等。
版本在文档中被分解并存储为单独的值。例如:{ VER_MAJOR:"0",VER_MINOR:"2",VER_REVISION:"3",VER_PATCH:"20}
我的应用程序希望能够指定一个特定的版本,并根据该版本获取文档和之前的N个文档。
例如:
如果是version = 0.2.3.20和n = 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的数据库似乎不是正确的方法。但是,对测试结果数据库进行排序似乎会有很多开销,我是否错了,我应该担心选项2会产生大量的开销?我的印象是,我必须查询整个数据库,然后在应用程序端对其进行排序。查询整个数据库似乎太过分了.
db.collection_name.find().sort([Paramaters for sorting])发布于 2019-01-11 03:32:03
您非常正确地认为,查询和排序整个数据集是非常过分的。我可能在这件事上做得太过火了,但我试着把下面的所有细节都分解了。
术语
第一件事,是一对术语挑剔的人。我认为,当您使用单词 Collection时,您使用的是术语Database。区分这两个概念将有助于导航文档,并允许更好地理解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 }创建此索引将允许查询完成,只扫描它将返回的结果,同时避免内存中的排序。更多信息可以找到这里。
https://stackoverflow.com/questions/54115744
复制相似问题