2013-01-25 21 views
11

Tôi đang cố sắp xếp dữ liệu theo ngày trước và sau đó nhóm trên một trường khác. Nó không hoạt động với tôi.Khung tập hợp Mongo, Sắp xếp và sau đó nhóm không hoạt động

Câu hỏi tôi đang cố trả lời là: Chọn cid khác biệt gần đây nhất?

đưa dữ liệu này:

db.summary.save({"lid" : 5, "date" : 5, "cid" : 2, "circles" : [ 2 ] }) 
db.summary.save({"lid" : 2, "date" : 2, "cid" : 1, "circles" : [ 2 ] }) 
db.summary.save({"lid" : 4, "date" : 0, "cid" : 3, "circles" : [ 2 ] }) 
db.summary.save({"lid" : 3, "date" : 3, "cid" : 2, "circles" : [ 2 ] }) 
db.summary.save({"lid" : 1, "date" : 1, "cid" : 1, "circles" : [ 2 ] }) 

db.summary.aggregate({$match :{circles: 2}, $sort: {date: -1}, $group: {_id: '$cid'}}) 

Tôi đang làm một trận đấu đầu tiên trên vòng tròn, sau đó một sắp xếp trên ngày, sau đó một nhóm trên cid

Kết quả tôi nhận được:

{ 
    "result" : [ 
     { 
      "_id" : 3 
     }, 
     { 
      "_id" : 1 
     }, 
     { 
      "_id" : 2 
     } 
    ], 
    "ok" : 1 
} 

Đây là phân tích của tôi:

trước phù hợp hoặc sắp xếp theo ngày, dữ liệu là:

"lid" : 5, "date" : 5, "cid" : 2 
"lid" : 2, "date" : 2, "cid" : 1 
"lid" : 4, "date" : 0, "cid" : 3 
"lid" : 3, "date" : 3, "cid" : 2 
"lid" : 1, "date" : 1, "cid" : 1 

Sau khi sắp xếp theo ngày, tập dữ liệu sẽ là:

"lid" : 5, "date" : 5, "cid" : 2 
"lid" : 3, "date" : 3, "cid" : 2 
"lid" : 2, "date" : 2, "cid" : 1 
"lid" : 1, "date" : 1, "cid" : 1 
"lid" : 4, "date" : 0, "cid" : 3 

Vì vậy, sau khi nhóm, kết quả tôi mong đợi là:

{ 
    "result" : [ 
     { 
      "_id" : 2 
     }, 
     { 
      "_id" : 1 
     }, 
     { 
      "_id" : 3 
     } 
    ], 
    "ok" : 1 
} 

Truy vấn nào giải quyết được sự cố của tôi?

Tại sao truy vấn hiện tại không hoạt động đối với tôi?

+0

Thông số đường dẫn của bạn tới 'tổng hợp' cần phải được đặt trong một mảng hoặc được truyền dưới dạng đối tượng độc lập thay vì một đối tượng lớn. Và câu hỏi của bạn nói về việc nhóm lại trên 'cid' nhưng lệnh này được nhóm lại thành' $ date'. – JohnnyHK

+0

Đó là lỗi đánh máy. Nó phải là $ group: {_id: '$ cid'} – ben39

Trả lời

17

Khi bạn $group sau khi $sort trong đường dẫn, sắp xếp trước bị mất. Bạn sẽ phải làm một cái gì đó như thế này thay vì để ngày bạn muốn sắp xếp theo thể khả dụng sau nhóm:

db.summary.aggregate(
    {$match: {circles: 2}}, 
    {$group: {_id: '$cid', date: {$max: '$date'}}}, 
    {$sort: {date: -1}}); 

kết quả:

[ { _id: 2, date: 5 }, 
    { _id: 1, date: 2 }, 
    { _id: 3, date: 0 } ] 

Thêm một $project đến cuối của đường ống nếu bạn muốn định hình lại đầu ra.

+0

Cảm ơn! Đó là chính xác những gì tôi đang tìm kiếm mặc dù tôi đã tìm ra nó theo thời gian bạn trả lời :) – ben39

+1

đừng quên rằng nếu bạn muốn sắp xếp bất cứ điều gì trên nhóm $ bạn phải bao gồm nó trong $ sort với '_id .ngày'. kiểm tra http://stackoverflow.com/questions/21265170/mongodb-aggregation-sort-not-working – mwm

+2

"Khi bạn $ nhóm sau một $ sắp xếp trong các đường ống, các loại trước đó bị mất." Điều này là không thực sự đúng (có thể đã lỗi thời). Không chỉ là nó có thể, nhưng nó là cách ưa thích vì cách sắp xếp này có thể sử dụng các chỉ mục: https://docs.mongodb.com/manual/reference/operator/aggregation/sort/#sort-operator-and-performance – slouc

Các vấn đề liên quan