2014-10-16 40 views

Trả lời

3

Bạn có thể sử dụng tập lệnh shell mongo. Lưu ý rằng nó sẽ thực hiện quét toàn bộ bảng.

function findMinMax() { 
     var max = 0; 
     var min = db.collection.findOne().fieldName.length; 

     db.collection.find().forEach(function(doc) { 
      var currentLength = doc.fieldName.length; 
      if (currentLength > max) { 
       max = currentLength; 
      } 
      if (currentLength < min) { 
       min = currentLength; 
      } 
     }); 

     print(max); 
     print(min); 
    } 

    use <databaseName> 
    findMinMax(); 

Bạn có thể lưu các chức năng trong một tập tin nói c: \ minMax.js và chạy nội dung tập tin,

c:\mongodb\bin> mongo dbName < c:\minMax.js 

Lưu ý: bạn có thể cần phải cung cấp tên máy cần thiết, tên người dùng, mật khẩu để kết nối với cơ sở dữ liệu của bạn.

c:\mongodb\bin> mongo --host hostName --port portNumber -u userName -p password dbName < c:\minMax.js 
+0

Làm cách nào để chạy tập lệnh này dưới dạng tập lệnh shell mongo? – user3705478

+0

Vì vậy, khi tôi lưu các chức năng như minMax.js, tôi nên thay thế db.collection.find(). ForEach (function (doc) {với db. .find(). ForEach (function (doc)? Nên Tôi cũng cung cấp cho tên cơ sở dữ liệu của tôi ở đây sử dụng ? – user3705478

5

Trong phiên bản hiện đại MongoDB có $strLenBytes hoặc $strLenCP khai thác tập hợp hơn cho phép bạn chỉ cần làm:

Class.collection.aggregate([ 
    { "$group" => { 
    "_id" => nil, 
    "max" => { "$max" => { "$strLenCP" => "$a" } }, 
    "min" => { "$min" => { "$strLenCP" => "$a" } } 
    }} 
]) 

đâu "a" là chuỗi tài sản trong tài liệu bạn muốn để có được những phút và chiều dài tối đa từ.


Để xuất ra độ dài tối thiểu và tối đa, phương pháp tốt nhất có thể sử dụng mapReduce với một vài thủ thuật để giữ giá trị.

Trước tiên, bạn định nghĩa một hàm ánh xạ mà chỉ là thực sự sẽ ra một mục duy nhất từ ​​bộ sưu tập của bạn để giảm tải:

map = Q%{ 
    function() { 

     if (this.a.length < store[0]) 
     store[0] = this.a.length; 

     if (this.a.length > store[1]) 
     store[1] = this.a.length; 

     if (count == 0) 
     emit(null, 0); 

     count++; 

    } 
} 

Vì đây đang làm việc chủ yếu với một biến scoped toàn cầu giữ min và max độ dài bạn chỉ muốn thay thế điều này trong một hàm finalize trên một tài liệu được phát ra. Không có giảm sân khấu, nhưng định nghĩa một hàm "blank" cho điều này mặc dù nó không được gọi là:

reduce = Q%{ function() {} } 

finalize = Q%{ 
    function(key,value) { 
     return { 
      min: store[0], 
      max: store[1] 
     }; 
    } 
} 

Sau đó gọi điện cho hoạt động MapReduce:

Class.map_reduce(map,reduce).out(inline: 1).finalize(finalize).scope(store: [], count: 0) 

Vì vậy, tất cả công việc được thực hiện trên máy chủ chứ không phải bằng cách lặp lại kết quả được gửi đến ứng dụng khách. Trên một tập hợp nhỏ như thế này:

{ "_id" : ObjectId("543e8ee7ddd272814f919472"), "a" : "this" } 
{ "_id" : ObjectId("543e8eedddd272814f919473"), "a" : "something" } 
{ "_id" : ObjectId("543e8ef6ddd272814f919474"), "a" : "other" } 

Bạn nhận được một kết quả như thế này (sản lượng vỏ, nhưng nhiều giống nhau cho cả lái xe):

{ 
    "results" : [ 
      { 
        "_id" : null, 
        "value" : { 
          "min" : 4, 
          "max" : 9 
        } 
      } 
    ], 
    "timeMillis" : 1, 
    "counts" : { 
      "input" : 3, 
      "emit" : 1, 
      "reduce" : 0, 
      "output" : 1 
    }, 
    "ok" : 1 
} 

Vì vậy, MapReduce cho phép xử lý JavaScript trên máy chủ để làm điều này khá nhanh chóng, giảm lưu lượng mạng của bạn. Hiện tại không có cách nào khác cho MongoDB để trả về độ dài chuỗi ngay bây giờ, do đó việc xử lý JavaScript là cần thiết trên máy chủ.

+0

@muistooshort Tại sao phát ra 500000 tài liệu là điểm chính. OP chỉ muốn giá trị tối thiểu và tối đa. Toàn cục là 'JavaScript' được khai báo và được truyền như vậy. Và chỉ có thể truy cập vào các chức năng mapReduce. Đủ rõ ràng? –

+0

@muistooshort MongoDB không có bất kỳ toán tử nào khác để trả về độ dài của một chuỗi, vì vậy bạn cần JavaScript và mapReduce là cách duy nhất để "trả về" kết quả. Nó có thể tốt hơn nếu có cái gì đó bản địa, nhưng đây vẫn là một so sánh "toàn cầu" của một giá trị tài liệu so với một giá trị khác, một lần nữa, nơi mapReduce là thứ duy nhất được cung cấp để cung cấp. Đập 500.000 tài liệu tại một bộ giảm tốc để thực hiện công việc có thể được thực hiện trong người lập bản đồ sẽ là một hack và không cần thiết, chưa kể đến nhiều công việc hơn. Không có chuỗi bên trong trong JavaScript được trích dẫn để nó không thực sự quan trọng. –

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