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

Có giải pháp nào để cho phép sử dụng regex trong đường ống tổng hợp Mongodb không

Câu hỏi này dường như đến nhiều lần mà không có lời giải. Có hai giải pháp khả thi mà tôi biết:giải pháp 1- sử dụng mapReduce. mapReduce là hình thức tổng hợp chung cho phép người dùng làm bất cứ điều gì có thể tưởng tượng và có thể lập trình được.

sau đây là giải pháp trình bao mongo bằng cách sử dụng mapReduce Chúng tôi xem xét bộ sưu tập 'st' sau đây.

{ "_id" : ObjectId("51d6d23b945770d6de5883f1"), "foo" : "foo1", "bar" : "bar1" }
{ "_id" : ObjectId("51d6d249945770d6de5883f2"), "foo" : "foo2", "bar" : "bar2" }
{ "_id" : ObjectId("51d6d25d945770d6de5883f3"), "foo" : "foo2", "bar" : "bar22" }
{ "_id" : ObjectId("51d6d28b945770d6de5883f4"), "foo" : "foo2", "bar" : "bar3" }
{ "_id" : ObjectId("51d6daf6945770d6de5883f5"), "foo" : "foo3", "bar" : "bar3" }
{ "_id" : ObjectId("51d6db03945770d6de5883f6"), "foo" : "foo4", "bar" : "bar24" }

chúng tôi muốn nhóm theo foo và đối với mỗi foo, đếm số lượng tài liệu, cũng như số lượng tài liệu có thanh chứa chuỗi con 'bar2'. nghĩa là:

foo1: nbdoc=1, n_match = 0
foo2: nbdoc=3, n_match = 2
foo3: nbdoc=1, n_match = 0
foo4: nbdoc=1, n_match = 1

Để làm điều đó, hãy xác định chức năng bản đồ sau

var mapFunction = function() {
  var key = this.foo;
  var nb_match_bar2 = 0;
  if( this.bar.match(/bar2/g) ){
    nb_match_bar2 = 1;
  }
  var value = {
    count: 1,
    nb_match: nb_match_bar2
  };

  emit( key, value );
};

và chức năng giảm sau

var reduceFunction = function(key, values) {

  var reducedObject = {
    count: 0,
    nb_match:0
  };
  values.forEach( function(value) {
    reducedObject.count += value.count;
    reducedObject.nb_match += value.nb_match;
  }
  );
  return reducedObject;
};

chạy mapduce và lưu trữ kết quả trong bộ sưu tập map_reduce_result

db.st.mapReduce(mapFunction, reduceFunction, {out:'map_reduce_result'})
{
  "result" : "map_reduce_result",
  "timeMillis" : 7,
  "counts" : {
    "input" : 6,
    "emit" : 6,
    "reduce" : 1,
    "output" : 4
},
"ok" : 1,
}

Cuối cùng, chúng ta có thể truy vấn bộ sưu tập map_reduce_result, thì đấy! giải pháp

> db.map_reduce_result.find()
{ "_id" : "foo1", "value" : { "count" : 1, "nb_match" : 0 } }
{ "_id" : "foo2", "value" : { "count" : 3, "nb_match" : 2 } }
{ "_id" : "foo3", "value" : { "count" : 1, "nb_match" : 0 } }
{ "_id" : "foo4", "value" : { "count" : 1, "nb_match" : 1 } }

Giải pháp 2- sử dụng hai tổng hợp riêng biệt và hợp nhất Tôi sẽ không cung cấp chi tiết cho giải pháp này vì bất kỳ người dùng mongo nào cũng có thể dễ dàng thực hiện. bước 1:thực hiện tổng hợp, bỏ qua phần yêu cầu regex thành tổng. bước 2:thực hiện nhóm tổng hợp thứ hai trên cùng một khóa với khóa của bước một. giai đoạn 1 của quy trình:khớp biểu thức chính quy; giai đoạn 2:nhóm trên cùng một khóa như trong bước đầu tiên và đếm số lượng tài liệu trong mỗi nhóm {$ sum:1}; bước 3:hợp nhất kết quả của bước 1 và 2:đối với mỗi khóa xuất hiện trong cả hai kết quả, hãy thêm trường mới, nếu khóa không xuất hiện trong kết quả thứ hai, hãy đặt khóa mới thành 0.

Thì đấy! một giải pháp khác.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Các phương pháp hay nhất để bảo mật MongoDB

  2. Chèn tài liệu vào MongoDB chỉ khi tất cả các trường là duy nhất

  3. Tại sao giới thiệu của tôi không điền tài liệu?

  4. mongoimport Docker Không thành công:lỗi kết nối với máy chủ db:không có máy chủ nào truy cập được

  5. Spring boot + mongodb + vấn đề kết nối tuyến lạc đà