MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB ánh xạ / giảm bớt qua nhiều bộ sưu tập?

Một hàm giảm có thể được gọi một lần, với một khóa và tất cả các giá trị tương ứng (nhưng chỉ khi có nhiều giá trị cho khóa - nó hoàn toàn không được gọi nếu chỉ có 1 giá trị cho khóa).

Nó cũng có thể được gọi nhiều lần, mỗi lần bằng một khóa và chỉ một tập hợp con của các giá trị tương ứng và các kết quả giảm trước đó cho khóa đó. Trường hợp này được gọi là tái giảm . Để hỗ trợ giảm thiểu lại, chức năng giảm của bạn phải là chức năng tối ưu.

Có hai tính năng chính trong chức năng giảm giá trị trung bình:

  • Giá trị trả về của hàm giảm phải ở định dạng giống như các giá trị nó nhận vào. Vì vậy, nếu hàm giảm của bạn chấp nhận một mảng chuỗi, thì hàm sẽ trả về một chuỗi. Nếu nó chấp nhận các đối tượng có một số thuộc tính, nó sẽ trả về một đối tượng chứa các thuộc tính tương tự. Điều này đảm bảo rằng hàm không bị hỏng khi nó được gọi với kết quả của lần giảm trước đó.
  • Không đưa ra các giả định dựa trên số lượng giá trị nó có trong. Nó không được đảm bảo rằng các giá trị values tham số chứa tất cả các giá trị cho khóa đã cho. Vì vậy, sử dụng values.length trong tính toán là rất rủi ro và cần tránh.

Cập nhật: Hai bước dưới đây không bắt buộc (hoặc thậm chí có thể, tôi chưa kiểm tra) trên các bản phát hành MongoDB gần đây hơn. Bây giờ nó có thể xử lý các bước này cho bạn, nếu bạn chỉ định một tập hợp đầu ra trong các tùy chọn thu nhỏ bản đồ:

{ out: { reduce: "tempResult" } }

Nếu hàm rút gọn của bạn là không quan trọng, bạn sẽ không gặp bất kỳ vấn đề gì khi giảm bản đồ nhiều bộ sưu tập. Chỉ cần giảm bớt kết quả của từng bộ sưu tập:

Bước 1

Chạy thu nhỏ bản đồ trên mỗi bộ sưu tập bắt buộc và lưu kết quả trong một bộ sưu tập tạm thời, duy nhất. Bạn có thể lưu trữ các kết quả bằng cách sử dụng hàm cuối cùng:

finalize = function (key, value) {
  db.tempResult.save({ _id: key, value: value });
}

db.someCollection.mapReduce(map, reduce, { finalize: finalize })
db.anotherCollection.mapReduce(map, reduce, { finalize: finalize })

Bước 2

Chạy một bản đồ giảm khác trên bộ sưu tập tạm thời, sử dụng cùng một chức năng thu nhỏ . Chức năng bản đồ là một chức năng đơn giản chọn các khóa và giá trị từ bộ sưu tập tạm thời:

map = function () {
  emit(this._id, this.value);
}

db.tempResult.mapReduce(map, reduce)

Bản đồ giảm thứ hai này về cơ bản là một bản thu nhỏ lại và sẽ cung cấp cho bạn kết quả bạn cần.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tạo cơ sở dữ liệu trong MongoDB

  2. loại trừ các trường trong tổng hợp $ lookup

  3. Id đối tượng Mongo DB deserializing sử dụng trình tuần tự JSON

  4. Cách lập trình phân tách trước một khóa phân đoạn dựa trên GUID với MongoDB

  5. Làm cách nào để sử dụng biến regex trong truy vấn cho MongoDB