2011-09-18 27 views
5

Tôi muốn thực hiện câu lệnh SQL này trên MongoDB:Chọn biệt nhiều hơn một lĩnh vực sử dụng bản đồ MongoDB của giảm

SELECT DISTINCT book,author from library 

Cho đến nay DISTINCT của MongoDB chỉ hỗ trợ một thực tế tại một thời điểm. Đối với nhiều trường, chúng ta phải sử dụng lệnh GROUP hoặc map-reduce.

Tôi có googled một cách để sử dụng lệnh GROUP:

db.library.group({ 
    key: {book:1, author:1}, 
    reduce: function(obj, prev) { if (!obj.hasOwnProperty("key")) { 
     prev.book = obj.book; 
     prev.author = obj.author; 
    }}, 
    initial: { } 
}); 

Tuy nhiên phương pháp này chỉ hỗ trợ lên đến 10.000 phím. Có ai biết cách sử dụng map map để giải quyết vấn đề này không?

Trả lời

4

Hãy xem tại đây article giải thích cách tìm các bài viết độc đáo bằng cách sử dụng giảm bản đồ trong MongoDB.

tuyên bố Emit của bạn sẽ giống như thế:

emit({book: this.book, author: this.author}, {exists: 1}); 

và giảm của bạn có thể thậm chí đơn giản hơn ví dụ kể từ khi bạn không quan tâm đến có bao nhiêu cho mỗi nhóm.

return {exists: 1}; 
+0

cảm ơn rất nhiều. nó hoạt động tốt. nhưng tôi vẫn gặp khó khăn trong việc tìm kiếm hàm '{exist: 1}'. trong sự hiểu biết của tôi, nó là một định danh cho mỗi giá trị duy nhất. nhưng tôi vẫn thấy lạ. –

+1

Thông thường giá trị phức tạp hơn và có nhiều trường. Bạn có thể đơn giản hóa điều này để chỉ phát ra giá trị 1 nhưng '{exist: 1}' tự giải thích nhiều hơn và sẽ dễ dàng hơn khi bạn muốn thêm nhiều trường vào nó sau này. –

3

Trong trường hợp ai đó phải đối mặt với vấn đề tương tự. Đây là giải pháp đầy đủ:

Map bước

map= "function(){ 
    emit(
      {book: this.book, author:this.author}, {exists: 1} 
     ); 
    }" 

Giảm bước

reduce= "function(key, value){ 
      return {exists: 1}; 
    }" 

Run lệnh

result= db.runCommand({ 
     "mapreduce": "library", 
     "map": map, 
     "reduce": reduce, 
     "out: "result" 
    }) 

Nhận kết quả

db.result.find() 
Các vấn đề liên quan