2012-08-15 26 views
26

Ví dụ, có một bộ sưu tập như thế này:
Làm cách nào để thực hiện hiệu quả "riêng biệt" với nhiều phím?

{thị trường: 'SH', mã: '000001', ngày: '2012/01/01', giá: 1000}
{thị trường : 'SZ', mã: '000001', ngày: '2012-01-01', giá: 1000}
{thị trường: 'SH', mã: '000001', ngày: '2012-01-02', giá: 1000}
{market: 'SZ', mã: '000001', ngày: '2012-01-02', giá: 1000}
{market: 'SH', mã: '000002', ngày: '2012-01-03', giá: 1000}
...

Bộ sưu tập này chứa hàng chục triệu tài liệu.

Tôi muốn gọi riêng biệt với hai phím:

collection.distinct('market', 'code'); 

và nhận được kết quả:

[{thị trường: 'SH', mã: '000001'}, {thị trường: 'SZ', mã: '000001'}, { thị trường: 'SH', mã: '000.002'}]

Như lệnh riêng biệt có nguồn gốc chấp nhận chỉ có một chìa khóa, tôi cố gắng thực hiện bằng cách sử dụng map-reduce. Nhưng việc giảm bản đồ quá chậm so với bản địa riêng biệt. Trong thử nghiệm riêng biệt một phím của tôi, giảm chi tiêu bản đồ dài hơn khoảng mười lần so với bản địa riêng biệt.
Có cách nào hiệu quả để thực hiện đa dạng riêng biệt không?

Trả lời

53

Nếu bạn sẵn sàng chờ cho 2.2 phát hành sắp tới của MongoDB, bạn có thể chạy truy vấn này một cách hiệu quả bằng cách sử dụng khuôn khổ hợp:

collection = db.tb; 
result = collection.aggregate( 
      [ 
       {"$group": { "_id": { market: "$market", code: "$code" } } } 
      ] 
     ); 
printjson(result); 

Trên một bộ sưu tập hàng triệu bản ghi trên máy tính thử nghiệm của tôi, điều này chạy trong 4 giây, trong khi phiên bản map/reduce mất hơn một phút.

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