【问题标题】:In MongoDb is there a way to get last 1000 array elements from multiple documents在 MongoDb 中有一种方法可以从多个文档中获取最后 1000 个数组元素
【发布时间】:2017-09-26 14:17:19
【问题描述】:

给定以下 Mongo 文档模型:

集合中的每个文档代表 1 小时的资源监控。在每个文档中,都有一个摘要集合。总结的数量也被计算为整数,因为它可以让生活更轻松。

是否有一种有效的方法来查询集合并仅返回最近的 1000 个摘要作为聚合列表?

或者是查询集合并返回包含最近 1000 个摘要的文档数量的有效方法?

每个文档中的摘要数量会有所不同,但单个文档中的摘要数量永远不会超过 1000。

编辑:我应该提到我正在使用带有 .NET 驱动程序的 mongo,所以我可以使用 LINQ。

【问题讨论】:

  • 我有几个问题:您运行的是哪个版本的 MongoDB?您是否在某个日期过滤请求? (即:2017 年 9 月 26 日的摘要)
  • 我相信我使用的是 3.4.7 版本并且我使用的是 csharp 驱动程序 v2.4.4.0。我通常对时间戳进行过滤并将其编入索引,我想如果有 1000 个摘要,我可能会检查几个小时,但我想知道是否有更有效的方法。

标签: arrays mongodb nosql querying


【解决方案1】:

你看过 Mongo 聚合吗?如果你想返回 1000 个最近的摘要,你可以使用 $unwind 和 $replaceRoot 操作,这是我尝试的 shell 查询:

db.getCollection('test').aggregate([
{$match : {your timestamp match query here}},
{$sort : {"timestamp": -1}},
{$unwind : "$summaries"},
{$limit : 1000},
{$replaceRoot: {newRoot: "$summaries"}}
])

聚合管道开始时的匹配操作很重要,因为索引仅在第一步使用。如果你解开你的整个收藏,你的表现可能会急剧下降。

【讨论】:

  • 关于你的第二个问题,你到底想返回什么,包含前 1000 个时间戳的文档的 id 或只是文档的数量?
  • 最后我想要一个最近的 1000 个摘要的列表。
  • 我明天试试。感谢您的帮助
  • 好的,刚刚在 Robo 中测试过,效果很好……现在来看看如何用驱动程序来做。感谢您的帮助
猜你喜欢
  • 2019-09-07
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 2020-11-20
  • 2020-07-03
  • 1970-01-01
相关资源
最近更新 更多