У меня есть такая коллекция:
[
{ 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 }
]
Учитывая запрос с соответствующими родительскими идентификаторами, ['b','c']
, мне нужно получить первые 3 результата для каждого родителя, надеюсь, отсортированные по DESC по w
:
[
{ 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 результатов в целом, а не первые N для каждого parent
. Используя .aggregate()
, я понял, как агрегировать по parent
, но я не мог понять, как $limit
по родителю или как вернуть все документы как {parent: 'b', items: [{..}, {..}] }
, а не только данные группы. Я могу получить либо parent
, который у меня уже был, либо, может быть, parent
и массив на каком-то поле с помощью $push
, но это все равно не годится.
Наконец, я также попробовал .mapReduce
, но это кажется излишним, не придется ли мне использовать emit(this.project, this);
для части агрегации? как бы я даже $ лимит на это? рукой? Это довольно малодокументировано.
В любом случае, какое-то направление, куда идти, было бы здорово здесь. Я использую mongoose@latest
.