MongoDB:聚合 - 如果不为空则为组条件

时间:2015-02-10 21:08:35

标签: mongodb aggregation-framework

如果有这样的数据:

{
 user: "max",
 uploaded: <timestamp>,
 updated: <timestamp>
}
{
 user: "tim",
 uploaded: <timestamp>
}

用户可以拥有不同的商品。现在我使用带有$ match + $ group的mongoDB聚合框架,如下所示:

aggregate([
{ $match: {"username": "foouser"}},
{ $group: {
  ...other items..
  "last_active": max(updated) OR IF EMPTY max(uploaded)
}
]);

我想设置&#34; last_active&#34;到更新的最大时间戳,以获得用户对其所有项目的最后一个活动。但并非每个项目都有更新属性。也许在用户的任何元素中都有update-property。因此,如果max(已更新)为空,则应选择max(已上载)。

任何人都可以按小组顺序帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

聚合管道在版本之间发生了很大的变化,因此建议您使用mongodb的最新稳定版本。

尝试组合$ max和$ setUnion运算符,如下所示:

db.Collection.aggregate([
    { $match: {"username": "foouser"}},
    { $group: {
    ...other items..
    "last_active": { $max: { $setUnion: [ "$updated", "$uploaded" ] } }
    }
]);

或$ ifNull和$ max:

db.Collection.aggregate([
    { $match: {"username": "foouser"}},
    { $group: {
    ...other items..
    "last_active": { $max: { $ifNull: [ "$updated", "$uploaded" ] } }
    }
]);