MongoDB - 我可以将查询结果限制为一个记录/用户/天吗?

时间:2013-07-30 19:17:36

标签: mongodb group-by

我有两种类型的活动表(A和B)。这些活动由用户生成。我想要做的是抓住20个最近的活动,但是对于B活动,只包括当天用户创建的第一个活动。因此,如果用户在一天内创建了4个A活动和4个B活动,它将显示所有4个A活动,但仅显示创建的第一个B活动。如果他们在第二天再次创建相同数量的活动,则查询将显示所有8个A活动,但仅显示2个B活动。

我目前的方法是使用group by子句获取B活动列表,并在日期和用户上进行分组。我有那个查询工作:

db.runCommand({    
  group: {
    ns: 'activities',
    $keyf: function(doc) {
      var created = doc._id.getTimestamp();
      created.setHours(0, 0, 0, 0);

      return { created: created, user: doc.user.id }
    },
    $reduce: function( curr, result ) { 
      // We only need the first activity of the day, but we can't sort (can we?)
      var earliestSoFar = result.date || new Date();

      if (earliestSoFar > curr._id.getTimestamp()) {
        result.id = curr._id;
        result.date = curr._id.getTimestamp();
      }
    },
    cond: {
      "type" : "B"
    },
    initial: {}
  }
})

我想我可以从结果集合中获取id并运行表单的最终查询:

.find({ $or: [
  { type: 'A' },
  { _id: { $in: getListOfIdsFromGroupQuery() }}
]}).limit(20);

我相信这会给我我想要的结果,但我害怕的是:

  1. 组查询将返回每个前B个活动/用户/日的列表。我一次只展示了20个活动,所以我只关心最近20个B活动(最多,因为我显示了20个A& B组合)。这看起来真的很浪费。
  2. 在第一个查询中,我可以将传递给$ in的数组减少到20个。但是,因为用户可以查看下一页,所以我必须为第二页传递40个ID,为第三页传递60个等。在第10页,我的$ in查询正在查找200条记录。不确定这是否有问题,但它让我担心。
  3. 有没有更好的方法来解决这个问题?希望很明显,我知道这是一种令人困惑的情况。

0 个答案:

没有答案