Слияние результатов Mongoose

У меня есть результат Mongoose Query:

[ { _id: 523ab1be60239c8120000001,
    posts: 
     [ { _id: 523ab1be60239c8120000002,
         creator: 523ab1be60239c8120000001,
         listingType: 'lease',
         title: 'My Second Listing - Made By Person 1',
         __v: 0 } ] },
  { _id: 523ab1e224bfaea520000001,
    posts: 
     [ { _id: 523ab1e224bfaea520000002,
         creator: 523ab1e224bfaea520000001,
         listingType: 'lease',
         title: 'My Second Listing - Made By Person 2',
         __v: 0 },
       { _id: 523ab865ae55497d27000001,
         creator: 523ab1e224bfaea520000001,
         listingType: 'free',
         title: 'My Third Listing - Made By Person 2',
         __v: 0 } ] } ]

Я хочу иметь возможность хранить все posts в одном массиве или объекте, чтобы я мог отсортировать их по их _id (отметка времени) и отображать их пользователю гораздо проще.

Есть идеи, как этого добиться? Я думаю о том, чтобы сделать цикл для каждого сообщения и выполнить какой-то алгоритм сортировки, чтобы достичь этого, но просто словом "цикл" это уже звучит неэффективно.

1 ответ

Решение

Если бы вы хотели отсортировать документы сами, я бы сказал, использовать функцию MongoDB sort(). Однако, поскольку вы хотите извлечь часть документов, объединить их в один объект и отсортировать, есть несколько вариантов, и я не уверен, какие из них будут работать лучше всего.

Если вы сохраните свой запрос таким, какой он есть, тогда у вас действительно есть выбор сортировки только на стороне приложения, используя какой-то цикл.

Вероятно, самый чистый способ сделать это - использовать структуру агрегации. В зависимости от того, каким был ваш исходный запрос, вы, вероятно, можете преобразовать его в $match операция и использовать его первым в вашем конвейере. Тогда вы должны быть в состоянии $unwind массив 'posts', $sort по метке времени и $group они снова вместе в один массив.

Другие вопросы по тегам