订单:
{
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/