3
是否有可能在同一个查询管道中有效地同时执行map reduce和lookup?mongo db - map reduce and lookup
比方说,我有两个集合:
- 项目:
{ _id, group_id, createdAt }
- 采购:
{ _id, item_id }
我想要得到的前n个项目组的基础上,购买的数量每组最近的x个项目。
如果我在项目文档中有可用购买数量,那么我可以聚合并排序,但事实并非如此。
我可以得到每组最近的X项目像这样:
let x = 3;
let map = function() {
emit(this.group_id, { items: [this] });
};
let reduce = function (key, values) {
return { items: getLastXItems(x, values.map(v => v.items[0])) };
};
let scope = { x };
db.items.mapReduce(map, reduce, { out: { inline: 1 }, scope }, function(err, res) {
if (err) {
...
} else {
// res is an array of { group_id, items } where items is the last x items of the group
}
});
但是我错过了购买数,所以我不能用它来排序组,输出前N个组(其顺便说一句,我甚至不知道我能做什么)
我在Web服务器上使用它,并根据用户上下文运行与范围变量的查询,所以我不想输出结果到另一个收集并且必须做一切内联。
===编辑1 ===添加数据例如:
样本数据可以是:
// items
{ _id: '1, group_id: 'a', createdAt: 0 }
{ _id: '2, group_id: 'a', createdAt: 2 }
{ _id: '3, group_id: 'a', createdAt: 4 }
{ _id: '4, group_id: 'b', createdAt: 1 }
{ _id: '5, group_id: 'b', createdAt: 3 }
{ _id: '6, group_id: 'b', createdAt: 5 }
{ _id: '7, group_id: 'b', createdAt: 7 }
{ _id: '8, group_id: 'c', createdAt: 5 }
{ _id: '9, group_id: 'd', createdAt: 5 }
// purchases
{ _id: '1', item_id: '1' }
{ _id: '2', item_id: '1' }
{ _id: '3', item_id: '3' }
{ _id: '4', item_id: '5' }
{ _id: '5', item_id: '5' }
{ _id: '6', item_id: '6' }
{ _id: '7', item_id: '7' }
{ _id: '8', item_id: '7' }
{ _id: '9', item_id: '7' }
{ _id: '10', item_id: '3' }
{ _id: '11', item_id: '9' }
并用n = 3
和x = 2
样品的结果将是:
[
group_id: 'a', numberOfPurchasesOnLastXItems: 4,
group_id: 'b', numberOfPurchasesOnLastXItems: 3,
group_id: 'c', numberOfPurchasesOnLastXItems: 1,
]
你可以张贴一些示例项目和购买的,随着一个例子结果?从您的描述中不清楚这里涉及的数据类型,例如购买是否包含item_id或单个item_id的数组? –
我编辑了这个问题,谢谢 – Guig
对不起,对于您的示例数据,'n = 3'和'x = 2'是什么意思? –