Trong mongoDB 3.2 bạn có thể thực hiện việc này bằng cách sử dụng truy vấn tổng hợp của biểu mẫu sau:
db.collection.aggregate(
{$sort: {created: -1}},
{$group: {_id:'$city', title:{$push: '$title'}},
{$project: {_id:0, city: '$_id', mostRecentTitle: {$slice: ['$title', 0, 2]}}}
)
Rất khó để đạt được điều tương tự bằng cách sử dụng mongoDB 3.0. Có một thủ thuật rất bẩn để đạt được điều này trong phiên bản 3.0. Nó bao gồm một vài bước và bộ sưu tập khác.
Đầu tiên, hãy tổng hợp và xuất kết quả vào một tập hợp tạm thời có tên là 'aggr_out'
Truy vấn:
db.collection.aggregate([
{$sort: {created: -1}},
{$group: {_id:'$city', title:{$push: '$title'}},
{$project: {city: '$_id', mostRecentTitle: '$title'}},
{$out: 'aggr_out'}]
)
Sử dụng truy vấn trên, mostRecentTitle sẽ có tất cả các tiêu đề gần đây được sắp xếp từ chỉ mục 0, 1, 2, ... Nếu bạn hài lòng với kết quả này bằng cách sử dụng điều này vì bạn đã có kết quả trong chỉ mục 0,1 và 2 của mostRecentTitle. Các tiêu đề khác có thể được bỏ qua đơn giản ở phía ứng dụng.
Tuy nhiên, nếu bạn không hài lòng, hãy cập nhật bộ sưu tập đầu ra 'aggr_out' và đọc dữ liệu từ bộ sưu tập này. Truy vấn là,
db.aggr_out.update(
{},
{$push: {
mostRecentTitle: {$each:[], $slice:3}
}
}
)
Thao tác trên sẽ cắt mảng mostRecentTitle để nó có ba tiêu đề gần đây nhất. Hãy đọc bộ sưu tập này để có được kết quả mong muốn của bạn.