2014-09-04 28 views
7

Tôi đang cố triển khai truy vấn nhóm lồng nhau trong mongodb và tôi đang gặp khó khăn khi cố gắng thêm nhóm bên ngoài theo. Với tài liệu dữ liệu bên dưới (đã được đơn giản hóa):MongoDB nhóm lồng nhau?

{ 
    "timestamp" : ISODate(), 
    "category" : "movies", 
    "term" : "my movie" 
} 

Tôi đang cố gắng đạt được danh sách tất cả các danh mục và trong các danh mục phải có số lượng cụm từ hàng đầu. Tôi muốn một cái gì đó đầu ra của tôi như thế này:

[ 
{ category: "movies", 
    terms: [ { term: "movie 1", total: 5000 }, { term: "movie 2", total: 200 } ... ] 
}, 
{ category: "sports", 
    terms: [ { term: "football 1", total: 4000 }, { term: "tennis 2", total: 250 } ... ] 
}, 
] 

'nhóm bên trong' của tôi là như hình dưới đây, và sẽ nhận được top 5 cho tất cả loại:

db.collection.aggregate([ 
    { $match : { "timestamp": { $gt: ISODate("2014-08-27") } } }, 
    { $group : { _id : "$term", total : { $sum : 1 } } }, 
    { $sort : { total : -1 } }, 
    { $limit: 5 } 
]); 

// Outputs: 
{ "_id" : "movie 1", "total" : 943 } 
{ "_id" : "movie 2", "total" : 752 } 

Làm thế nào tôi sẽ đi về thực hiện 'nhóm bên ngoài'?

Ngoài ra đôi khi ion tổng hợp ở trên] trả về giá trị null (không phải tất cả tài liệu đều có giá trị cụm từ). Làm thế nào để tôi bỏ qua các giá trị null?

cảm ơn trước

Trả lời

12

Bạn sẽ cần hai nhóm trong trường hợp này. Nhóm đầu tiên tạo ra một dòng văn bản với một tài liệu cho mỗi thuật ngữ và thể loại:

{ $group : { 
     _id : { 
     category: "$category", 
     term: "$term", 
     }, 
     total: { $sum : 1 } 
    } 
} 

Một nhóm thứ hai sau đó sẽ hợp nhất tất cả các tài liệu với cùng kỳ thành một, sử dụng toán tử $push kết hợp các loại thành một mảng:

{ $group : { 
     _id : "$_id.category", 
     terms: { 
      $push: { 
       term:"$_id.term", 
       total:"$total" 
      } 
     } 
    } 
} 
+1

cảm ơn! Điều này đã giải quyết được vấn đề của tôi, tôi đã thêm '{$ sort: {total: -1}}' vào giữa hai nhóm với toàn bộ các cụm từ được nhóm nhiều nhất ở trên cùng, nhưng tôi không thể tìm ra cách giới hạn các thuật ngữ để nói 5 mỗi danh mục. Việc thêm '{$ limit: 6}' vào giữa các nhóm không hoạt động. (Tôi đang cố gắng thực hiện 5 cụm từ hàng đầu cho mỗi truy vấn danh mục). cảm ơn! – clangers

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