Tôi có một số tài liệu 25k (4 GB trong dữ liệu thô) của dữ liệu mà tôi muốn thực hiện một vài thao tác javascript để giúp người dùng cuối của tôi dễ tiếp cận hơn (R
), và muốn sắp xếp "kiểm soát phiên bản" những thay đổi này bằng cách thêm bộ sưu tập mới cho mỗi thay đổi, nhưng tôi không thể tìm ra cách map/reduce
mà không có reduce
. Tôi muốn có một bản đồ tài liệu một-một, tôi bắt đầu với 25.356 tài liệu trong số collection_1
và tôi muốn kết thúc với 25.356 tài liệu trong số collection_2
.mongoDB map/reduce trừ bớt số
tôi có thể hack nó với điều này:
var reducer = function(key, value_array) {
return {key: value_array[0]}
}
Và sau đó gọi nó thích:
db.flat_1.mapReduce(mapper, reducer, {keeptemp: true, out: 'flat_2'})
(mapper của tôi chỉ các cuộc gọi phát ra một lần, với một chuỗi như là đối số đầu tiên và văn bản cuối cùng thứ hai. Đó là tập hợp các đối số thứ hai mà tôi thực sự muốn.)
Nhưng điều đó có vẻ khó xử và tôi không biết tại sao nó hoạt động, kể từ cuộc gọi emit
của tôi di tích trong bản đồ của tôi không tương đương với đối số trả về của số reducer
của tôi. Ngoài ra, tôi kết thúc bằng một tài liệu như
{
"_id": "0xWH4T3V3R",
"value": {
"key": {
"finally": ["here"],
"thisIsWhatIWanted": ["Yes!"]
}
}
}
có vẻ không cần thiết.
Ngoài ra, con trỏ thực hiện chèn riêng không phải là một phần mười nhanh như mapReduce
. Tôi không biết MongoDB đủ tốt để đánh giá nó, nhưng tôi đoán nó sẽ chậm hơn khoảng 50x
. Có cách nào để chạy qua một con trỏ song song không? Tôi không quan tâm liệu các tài liệu trong số collection_2
của tôi có theo thứ tự khác với các tài liệu trong số collection_1
hay không.
Lý do nó hoạt động là bởi vì phát và giảm tốc của bạn gọi * là * giống nhau. Vì bạn sử dụng giá trị [0] làm đầu ra của bộ giảm tốc của bạn nên nó phải giống chính xác vì bạn chưa thay đổi nó (nó chỉ truyền qua bộ giảm tốc của bạn). – null