匹配,分组和排序后,MongoDB将获得完整文档

时间:2019-03-22 21:03:32

标签: 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"
    }
  ]
}

我有一个收藏,上面有很多文件。我想查询订购剪刀的每个客户的最新订单。

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

要查找文档,我可以像find({ 'products.product_name' : "Scissors" })一样,但是随后我得到了剪刀的所有订单,我只想要最新的。

所以,我正在查看聚合... Mongo的“ $ group”聚合阶段似乎要求您在sum或max或其他内容内进行某种实际的聚合。我猜想这里可以使用$match$group$sort的某种组合,但我似乎不太能正常使用它。

有什么要关闭的

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

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

1 个答案:

答案 0 :(得分:1)

您可以使用$first运算符来获取最近的顺序(按降序排序),并使用特殊变量$$ROOT来获得最终结果中的整个对象:

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