在 MongoDb 中有没有办法从多个文档中获取最后 1000 个数组元素
In MongoDb is there a way to get last 1000 array elements from multiple documents
给定以下 Mongo 文档模型:
集合中的每个文档代表 1 小时的资源监视。在每个文档中,都有一个摘要集合。也有一个整数的摘要数量计数,因为它可以使生活更轻松。
是否有一种有效的方法来查询集合,return 只是将最近的 1000 个摘要作为聚合列表?
或者查询集合的有效方式return包含最近1000个摘要的文档数量?
每个文档中的摘要数量会有所不同,但单个文档中的摘要数量绝不会超过 1000。
编辑:我应该提到我正在使用 mongo 和 .NET 驱动程序,所以我可以使用 LINQ。
您看过 Mongo 聚合吗?如果你想 return 1000 个最近的摘要,你可以先用 $unwind 然后用 $replaceRoot 操作,这是我试过的 shell 查询:
db.getCollection('test').aggregate([
{$match : {your timestamp match query here}},
{$sort : {"timestamp": -1}},
{$unwind : "$summaries"},
{$limit : 1000},
{$replaceRoot: {newRoot: "$summaries"}}
])
聚合管道开头的匹配操作很重要,因为索引仅在第一步使用。如果你放松整个 collection 你的表现可能会急剧下降。
给定以下 Mongo 文档模型:
集合中的每个文档代表 1 小时的资源监视。在每个文档中,都有一个摘要集合。也有一个整数的摘要数量计数,因为它可以使生活更轻松。
是否有一种有效的方法来查询集合,return 只是将最近的 1000 个摘要作为聚合列表?
或者查询集合的有效方式return包含最近1000个摘要的文档数量?
每个文档中的摘要数量会有所不同,但单个文档中的摘要数量绝不会超过 1000。
编辑:我应该提到我正在使用 mongo 和 .NET 驱动程序,所以我可以使用 LINQ。
您看过 Mongo 聚合吗?如果你想 return 1000 个最近的摘要,你可以先用 $unwind 然后用 $replaceRoot 操作,这是我试过的 shell 查询:
db.getCollection('test').aggregate([
{$match : {your timestamp match query here}},
{$sort : {"timestamp": -1}},
{$unwind : "$summaries"},
{$limit : 1000},
{$replaceRoot: {newRoot: "$summaries"}}
])
聚合管道开头的匹配操作很重要,因为索引仅在第一步使用。如果你放松整个 collection 你的表现可能会急剧下降。