首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB从指定版本获取最后版本

MongoDB从指定版本获取最后版本
EN

Stack Overflow用户
提问于 2019-01-09 17:48:40
回答 1查看 32关注 0票数 0

我在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会产生大量的开销?我的印象是,我必须查询整个数据库,然后在应用程序端对其进行排序。查询整个数据库似乎太过分了.

代码语言:javascript
复制
db.collection_name.find().sort([Paramaters for sorting])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-11 03:32:03

您非常正确地认为,查询和排序整个数据集是非常过分的。我可能在这件事上做得太过火了,但我试着把下面的所有细节都分解了。

术语

第一件事,是一对术语挑剔的人。我认为,当您使用单词 Collection时,您使用的是术语Database。区分这两个概念将有助于导航文档,并允许更好地理解MongoDB。

集合和排序

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

查询

现在是有趣的部分。查询将如下所示:

代码语言:javascript
复制
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对结果进行排序,以返回按修补程序版本下降的结果。最后,限制操作符用于限制返回的文档数量。

索引

我们还没完呢!还记得你说过,查询整个集合并在应用程序端对其进行排序时,感觉是过火了吗?好的,如果这个查询不存在索引,数据库就会执行。

在确定索引中字段的顺序时,应遵循平等排序匹配规则。在这种情况下,这将给出索引:

代码语言:javascript
复制
{ "VER_MAJOR" : 1, "VER_MINOR" : 1, "VER_REVISION" : 1, "VER_PATCH" : 1 }

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54115744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档