我有两种类型的活动表(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);
我相信这会给我我想要的结果,但我害怕的是:
有没有更好的方法来解决这个问题?希望很明显,我知道这是一种令人困惑的情况。