MongoDB 在匹配、分组和排序后获取完整文档

标签 mongodb aggregation-framework

订单:

{
  order_id: 1,
  order_time: ISODate(...),
  customer_id: 456,
  products: [
    {
      product_id: 1,
      product_name: "Pencil"
    },
    {
      product_id: 2,
      product_name: "Scissors"
    },
    {
      product_id: 3,
      product_name: "Tape"
    }
  ]
}

我有一个包含一大堆像上面这样的文档的集合。我想查询每个订购剪刀的客户的最新订单。

也就是说,如果存在等于“Scissors”的“products.product_name”,按 customer_id 分组,请给我完整的文档,其中“order_time”是该组的“max”。

要查找文档,我可以像 find({ 'products.product_name' : "Scissors"}) 但随后我用 Scissors 获得所有订单,我只想要最新的.

所以,我正在考虑聚合... Mongo 的“$group”聚合阶段似乎要求您在内部进行某种实际的聚合,例如 sum 或 max 或其他。我猜测这里可以使用 $match$group$sort 的某种组合,但我似乎不太明白工作。

接近的东西:

db.storcap.aggregate(
[
{
  $match: { 'products.product_name' : "Scissors" }
},
{
  $sort: { created_at:-1 }
},
{
  $group: {
    _id: "$customer_id", 
  }
}]
)

但这不会返回完整的文档,而且我不确定它是否正确进行了排序和分组。

最佳答案

您可以使用$first运算符获取最新订单(按 desc 排序)和特殊变量 $$ROOT获得最终结果中的整个对象:

db.storcap.aggregate([
    {
        $match: { 'products.product_name' : "Scissors" }
    },
    {
        $sort: { created_at:-1 }
    },
    {
        $group: {
            _id: "$customer_id",
            lastOrder: { $first: "$$ROOT" }
        }
    }
])

关于MongoDB 在匹配、分组和排序后获取完整文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55307742/

相关文章:

java - 如何加快聚合查询?

mongodb - Mongo聚合查询耗时较长

python - 使用 pytest 测试 aiohttp 和 mongo

javascript - 简单的$ avg查询Node.js

MongoDB $reduce(aggregation) 将嵌套文档在数组中的总和分组并按组计数

javascript - 优化 Node.js 中的组合 MongoDB 查询

django - EmbeddedDocument ListField 中的 mongoengine 搜索

javascript - Route.get() 需要回调函数,但修改服务器路由后得到一个 [object Undefined]

javascript - mongodb:无法使用谷歌云功能将Many插入到MongoDB Atlas服务器

node.js - 如何在模式中动态添加对象?