【发布时间】:2015-10-29 19:36:43
【问题描述】:
假设我有一个这样的集合:
{
couponId: "abc",
state: "valid",
date: "2015-11-01"
}
{
couponId: "abc",
state: "expired",
date: "2015-10-01"
}
{
couponId: "abc",
state: "invalid",
date: "2015-09-01"
}
{
couponId: "xyz",
state: "invalid",
date: "2015-11-01"
}
{
couponId: "xyz",
state: "expired",
date: "2015-10-01"
}
{
couponId: "xyz",
state: "expired",
date: "2015-09-01"
}
...
优惠券可以有效/无效/过期。 现在,我想获取优惠券列表,其中每张优惠券都是根据以下逻辑选择的:
- 如果存在“有效”优惠券,请使用该优惠券
- 如果存在“过期”优惠券,则使用该优惠券
- 否则获得“无效”优惠券。
将此逻辑应用于上述列表应该会产生:
{
couponId: "abc", /* for "abc" "valid" exists */
state: "valid",
date: "2015-11-01"
},
{
couponId: "xyz", /* for "xyz" "valid" does not exist, use the next best "expired" */
state: "expired",
date: "2015-11-01"
}
基本上,有效>过期>无效
曾想过使用聚合操作,尝试模拟SQL groupby+sort+selectFirst,
db.xyz.aggregate([
{$sort : { couponId: 1, state: -1 } },
{$group : { _id : "$couponId", document: {$first : "$$ROOT"} }}
])
显然这不起作用,因为“状态”字段应该有一个自定义排序,其中有效>过期>无效。那么,可以在聚合中实现自定义排序吗?
或者有没有更好的方法来做我想做的事情?
【问题讨论】:
标签: mongodb aggregation-framework database nosql