【发布时间】:2015-03-08 02:21:13
【问题描述】:
我有一个这样的收藏:
[
{ parent: 'a', d1: '1', d2: '2', d3: '3', w: 10 },
{ parent: 'a', d1: '1', d2: '2', d3: '3', w: 20 },
{ parent: 'a', d1: '1', d2: '2', d3: '3', w: 30 },
{ parent: 'a', d1: '1', d2: '2', d3: '3', w: 40 },
{ parent: 'a', d1: '1', d2: '2', d3: '3', w: 50 },
{ parent: 'a', d1: '1', d2: '2', d3: '3', w: 60 },
{ parent: 'b', d1: '1', d2: '2', d3: '3', w: 10 },
{ parent: 'b', d1: '1', d2: '2', d3: '3', w: 13 },
{ parent: 'b', d1: '1', d2: '2', d3: '3', w: 14 },
{ parent: 'b', d1: '1', d2: '2', d3: '3', w: 15 },
{ parent: 'c', d1: '1', d2: '2', d3: '3', w: 10 },
{ parent: 'c', d1: '1', d2: '2', d3: '3', w: 100 },
{ parent: 'c', d1: '1', d2: '2', d3: '3', w: 200 },
{ parent: 'c', d1: '1', d2: '2', d3: '3', w: 300 }
]
给定一个带有相关父 ID 的查询 ['b','c'],我需要取回每个父级的前 3 个结果,希望按 w 进行 DESC 排序:
[
{ parent: 'b', d1: '1', d2: '2', d3: '3', w: 15 },
{ parent: 'b', d1: '1', d2: '2', d3: '3', w: 14 },
{ parent: 'b', d1: '1', d2: '2', d3: '3', w: 13 },
{ parent: 'c', d1: '1', d2: '2', d3: '3', w: 300 },
{ parent: 'c', d1: '1', d2: '2', d3: '3', w: 200 },
{ parent: 'c', d1: '1', d2: '2', d3: '3', w: 100 }
]
使用 .find() 和 .limit() 将返回整体的前 N 个结果,而不是每个 parent 的前 N 个结果。使用.aggregate() 我想出了如何通过parent 聚合,但我不知道如何通过父级来$limit,也不知道如何将整个文档返回为{parent: 'b', items: [{..}, {..}] } 而不仅仅是组数据。我可以得到我已经拥有的parent,或者可能是parent 和使用$push 的某个字段上的数组,但这仍然不好。
最后我也尝试了.mapReduce,但这似乎有点矫枉过正,我不需要emit(this.project, this); 来进行聚合部分吗?我怎么会 $limit 呢?用手?它的文档很少。
无论如何,这里的一些方向会很棒。我正在使用mongoose@latest。
【问题讨论】:
标签: node.js mongodb mapreduce mongoose aggregation-framework