2011-12-07 24 views
6

Khi tôi đang chạy Map-Giảm trên một cơ sở dữ liệu Mongo, tôi thường nhận được kết quả tương tự như sau:Làm thế nào để thay đổi cấu trúc của các kết quả giảm bản đồ của MongoDB?

{ _id: <some-id>, value: { <first-key>: <first-value>, ... } } 

Có cách nào để bỏ qua phần value: { ... } và trực tiếp chèn nội dung của value trong kết quả ? Về cơ bản, tôi muốn có kết quả trông giống như sau:

{ _id: <some-id>, <first-key>: <first-value>, ... } 

Bằng cách này tôi có thể hợp nhất kết quả trở lại vào bộ sưu tập hiện có tuân theo định dạng này.

Tôi cũng có một câu hỏi khác liên quan đến Map-Reduce: Có thể truy cập một bộ sưu tập khác bằng cách sử dụng chức năng map hoặc reduce không?

+0

có thể trùng lặp của [Trong MongoDB mapreduce, làm cách nào tôi có thể làm phẳng đối tượng giá trị?] (Http://stackoverflow.com/questions/7257989/in-mongodb-mapreduce-how-can-i-flatten-the-values -vật) –

Trả lời

6

MapReduce chỉ trả lại tài liệu có dạng {_id: some_id, giá trị: some_value}

"some_value" không nhất thiết phải là một tài liệu nhúng, nhưng trong nhiều trường hợp nó là để cho phép nhiều biến được tính toán bởi hàm Map Reduce. Các tài liệu được hàm reduce trả về phải ở cùng dạng như chúng được nhập vào, vì hàm reduce có thể chạy nhiều lần cho bất kỳ giá trị _id đã cho nào.

Để biết từng bước cách Map Reduce hoạt động, vui lòng xem phần "Tiện ích bổ sung" của công thức nấu ăn MongoDB Cookbook có tiêu đề "Tìm giá trị tối đa và tối thiểu với tài liệu được phiên bản" http://cookbook.mongodb.org/patterns/finding_max_and_min/. Giảm công trình và lý do đầu ra phải ở định dạng {_id: some_id, value: some_value}

Có thể thực hiện Giảm bản đồ gia tăng, kết hợp các kết quả của nhiều chức năng Map Reduce. http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-IncrementalMapreduce

Cuối cùng, hiện không thể truy cập nhiều bộ sưu tập cùng lúc với Map Reduce. Có một yêu cầu tính năng cho khả năng này, nhưng nó không được lên lịch để thêm vào bất kỳ phiên bản sắp tới nào.
https://jira.mongodb.org/browse/SERVER-970

0

Điều này làm việc cho tôi:
Giả sử bạn đang phát ra this hoặc biến thể của nó trong bản đồ, trước tiên hãy đặt this._id = undefined.
Đặt chế độ để hợp nhất.

Kiểm tra ví dụ của tôi here

0

RE: Truy cập các bộ sưu tập khác từ bên trong chức năng Map/Reduce. Những gì bạn có thể làm là tận dụng "phạm vi" để đẩy dữ liệu cần thiết bởi m/r trong khi thực thi. LƯU Ý: phạm vi chỉ chấp nhận một bộ sưu tập các đối tượng SIMPLE tại đây. Bởi đơn giản, tôi có nghĩa là không có tài liệu lồng nhau.

scope = { People : [{ Name : 'bob', Color : 'blue'}, { Name : 'sally', Color: 'orange'}] } 

Bộ sưu tập phạm vi trên hoạt động tốt. Trong am chức năng/r chỉ cần tham khảo 'dân' như là một biến toàn cầu và bạn có thể lặp qua bộ sưu tập của bạn, vv

scope = { People : [{ Name : 'bob', Color : { Favorite : 'blue'} }, { Name : 'sally', Color : { Favorite : 'orange' } }] } 

Trên đây sẽ không làm việc, tùy thuộc vào người lái xe bạn đang sử dụng bạn sẽ nhận được một lỗi phạm vi và nói rằng kích thước cuộc gọi tối đa đã được vượt quá hoặc một cái gì đó như thế. Gắn bó với các đối tượng đơn giản trong phạm vi sẽ giữ cho cuộc sống đơn giản.

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