当前位置: 首页 > 知识库问答 >
问题:

在Mongo聚合管道上使用$last

公羊灿
2023-03-14

我搜索了类似的问题,但没有找到任何问题。请随时为我指出他们的方向。

假设我有这个数据:

{ "_id" : ObjectId("5694c9eed4c65e923780f28e"), "name" : "foo1", "attr" : "foo" }
{ "_id" : ObjectId("5694ca3ad4c65e923780f290"), "name" : "foo2", "attr" : "foo" }
{ "_id" : ObjectId("5694ca47d4c65e923780f294"), "name" : "bar1", "attr" : "bar" }
{ "_id" : ObjectId("5694ca53d4c65e923780f296"), "name" : "bar2", "attr" : "bar" }

如果我想获取每个属性组的最新记录,我可以这样做:

> db.content.aggregate({$group: {_id: '$attr', name: {$last: '$name'}}})
{ "_id" : "bar", "name" : "bar2" }
{ "_id" : "foo", "name" : "foo2" }

我想让我的数据按属性分组,然后按id排序,这样每个组中只保留最新的记录,这就是我可以做到的。但我需要一种方法来避免在结果中命名我想要的所有字段(在本例中为“name”),因为在我的实际用例中,它们在前面是未知的。

那么,有没有办法做到这一点,但不必使用$last显式地命名每个字段,而只需使用所有字段?当然,我会在分组之前对数据进行排序,我只需要告诉Mongo“从最新的值中获取所有值”。

共有1个答案

叶晋
2023-03-14

请参见此处的一些可能选项:

  • 执行多重查找()。sort()查询要搜索的每个属性值

这不是最快的操作,但我假设您更多地将其用于分析,而不是响应用户行为。

编辑以添加slouc在评论中发布的示例:<代码>数据库。所容纳之物聚合({$组:{u id:“$attr”,lastItem:{$last:“$$ROOT”}}}})。

 类似资料:
  • 在今天的任务中,我尝试在一个集合中聚合文档(我们称之为集合1),在管道的一个阶段中,我尝试使用$lookup从另一个集合中检索文档(我们称之为集合2)。 收集1对象模型: 收集2对象模型: 我正试图做的是从集合2的where字段3中检索文档。字段31等于集合1的值。 我的$查找阶段看起来像这样,但目前似乎不起作用。我没有发现任何线索,如果这应该工作,但期待着你的答复。 我希望避免拥有一个项目或一个

  • 我有一个mongo搜索集。每个搜索都有一个criteria对象,该对象可以有任何条件组合。比如: 我正在构建一个mongo聚合管道,我想知道如何只投影密钥,以便我可以计算它们。 到目前为止,我的管道的第一步是: 这将正确返回所有criteria对象,现在我需要以某种方式投影键。有人有什么想法吗? 编辑:所需输出:

  • 我目前正在我的一个Java脚本中开发mongoDB聚合管道。 输入数据可以简化为不同客户的订单列表。例如: _id、customerId和orderId是字符串,金额是一个Long类型的数字,装运是名为shipping的自定义类的实体。现在,我想汇总这些数据,并显示每个customerId的总花费和所有发货量。对于第一位客户: {CusterId:123,发货:[发货1,发货2,发货4],金额:5

  • 也许有人有一个好主意,我们可以如何修复或解决Azure Cosmos DB中MongoDB聚合管道的当前实现中的一个错误(所以是的:我们已经在实例上打开了该功能)。 简短的版本是:在我们看来,阶段之后的aggregation阶段不起作用。它从不返回任何结果。 假设您已经在一个有效的数据库中(使用< code>use 粘贴以下 JavaScript(如果通过 Azure 门户创建了集合,则此行是可选

  • Azure Cosmos DB现在也支持聚合管道,这真的很好,这使它成为我们使用的一个可行替代品,而不是运行我们自己的Mongo DB容器,但我没有找到通过代码启用这些功能的方法(如何在门户中进行描述:https://azure.microsoft.com/en-gb/blog/azure-cosmosdb-extends-support-for-mongodb-aggregation-pipel

  • 我想知道如何在Elasticsearch中使用聚合时获得具有最高doc_count的存储桶。我正在使用Kibana示例数据kibana_sample_data_flights: 如果有一个存储桶具有最大文档计数,我可以将术语聚合的大小设置为1,但是如果有两个存储桶具有相同的最大文档计数,则这不起作用。 自从我涉足管道聚合以来,我觉得应该有一种简单的方法来实现这一点。最大桶聚合似乎能够处理多个最大桶