2013-02-01 41 views
8

Làm thế nào để bạn truy vấn mongodb để tìm độ dài của một trường chuỗi/văn bản cụ thể? Ngoài ra, bạn sẽ tìm thấy độ dài tối đa của bộ truy vấn như thế nào?Chọn độ dài chuỗi trong mongodb

Trả lời

4

Bầu trời là giới hạn! Không, thực ra nó là 16 MB cho một tài liệu trong mongodb. Đây có thể là độ dài tối đa của một chuỗi trong các bản ghi.

Để tìm độ dài tối đa trong một bộ truy vấn, bạn có thể làm công việc này xung quanh:

  1. Giữ độ dài của văn bản kèm theo văn bản riêng của mình.
  2. Sắp xếp tập hợp kết quả của bạn giảm dần theo chiều dài.
  3. Lấy phần tử đầu tiên có độ dài tối đa.
5

Thật không may, aggregation framework không hỗ trợ toán tử "len" tự động chuyển đổi chuỗi thành độ dài của chúng trong khi bạn thực hiện truy vấn. Vì vậy, bạn phải giải quyết điều này trong mã của riêng bạn. Bạn có thể

  1. sử dụng một hàm MapReduce để tính toán chuỗi độ dài
  2. truy vấn cho các dây và tính toán chiều dài trên lớp ứng dụng

Sự khác biệt giữa các phương pháp là chạy đầu tiên trên cơ sở dữ liệu trong khi sau này chạy trên máy chủ ứng dụng của bạn. Tôi muốn giới thiệu tùy chọn thứ hai, vì MapReduce có thể rất chậm và cồng kềnh để sử dụng.

-1

Không giống như SQL MongoDB không thực sự biết độ dài của các trường như vậy. Nhiều nhất là khi nó lập chỉ mục, nó biết rằng trường có dưới 1024 byte hay không.

Vì vậy, đây là điều mà bạn có thể sẽ phải sửa mặt khách hàng. Bạn có thể sử dụng một $where ở đây nhưng tôi nghĩ rằng bạn đang nhìn vào điều này sai nếu bạn muốn làm điều đó.

Bạn cũng có thể sử dụng và MR ở đây dưới dạng trạng thái @Philipp nhưng một lần nữa bạn có thể đang xem xét điều sai ở đây.

Truy vấn trong MongoDB thực ra là tài liệu BSON. Như vậy độ dài tối đa của một bộ truy vấn (tùy thuộc vào những gì bạn định nghĩa là "bộ truy vấn") luôn là 16MB (tại thời điểm này).

Nhiều trình điều khiển cung cấp phương tiện để mã hóa cấu trúc (băm hoặc dict hoặc bất kỳ thứ gì) thành BSON cho phép bạn đánh giá độ dài của chuỗi được mã hóa để hiểu kích thước truy vấn của bạn.

+5

điều này đơn giản là không đúng: MongoDB hoàn toàn biết chiều dài của chuỗi, nó là một phần của thông số bson cho chuỗi kiểu, 4 byte đầu tiên là độ dài của chuỗi. Chỉ có không có nhà điều hành cho phép bạn truy vấn trên đó. –

+0

@AsyaKamsky Đủ công bằng nên đã kiểm tra thông số kỹ thuật trước khi viết – Sammaye

2

cách sử dụng cụm từ thông dụng thay thế.

 
> db.apps.find({$where:"(this.id.length gt 6) && (this.id.length lt 15) " }).count(); 
2548 
> db.apps.find({$where:" (this.id.length gt 6) && (this.id.length lt 15) " }).explain(); 
{ 
    "cursor" : "BasicCursor", 
    "isMultiKey" : false, 
    "n" : 2548, 
    "nscannedObjects" : 88736, 
    "nscanned" : 88736, 
    "nscannedObjectsAllPlans" : 88736, 
    "nscannedAllPlans" : 88736, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 1, 
    "nChunkSkips" : 0, 
    "millis" : 1523, 
    "indexBounds" : { 

    }, 
    "server" : "shuhaimac.local:27017" 
} 
 
> db.apps.find({id:/\w{7,16}/i}).count(); 
2548 
> db.apps.find({id:/\w{7,16}/i}).explain(); 
{ 
    "cursor" : "BtreeCursor id_1 multi", 
    "isMultiKey" : false, 
    "n" : 2548, 
    "nscannedObjects" : 2548, 
    "nscanned" : 88736, 
    "nscannedObjectsAllPlans" : 2548, 
    "nscannedAllPlans" : 88736, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "millis" : 122, 
    "indexBounds" : { 
     "id" : [ 
      [ 
       "", 
       { 

       } 
      ], 
      [ 
       /\w{7,16}/i, 
       /\w{7,16}/i 
      ] 
     ] 
    }, 
    "server" : "shuhaimac.local:27017" 
} 
1

Vì vậy, tôi hy vọng điều này sẽ giúp. :-) Tôi chạy vào cùng một vấn đề - và nó đã cho tôi một thời gian để có được bản đồ làm việc giảm.

$response = $Mongo->yourdb->command(array(
    "mapreduce" => "yourcollection", 
    "map" => new MongoCode(" function() { emit(this.groupbykey, this.thestring.length); } "), 
    "reduce" => new MongoCode(" function(k, vals) { return Math.max.apply(null, vals); } "), 
    "query" => array("groupbykey" => "somevalue"), 
    "out" => array("inline" => 0) 
)); 

đáp ứng sẽ giữ kết quả bản đồ giảm

Array 
(
    [results] => Array 
     (
      [0] => Array 
       (
        [_id] => groupbykeyvalue 
        [value] => 106 
       ) 

     ) 

    [counts] => Array 
     (
      [input] => 7341 
      [emit] => 7341 
      [reduce] => 76 
      [output] => 1 
     ) 

    [timeMillis] => 189 
    [timing] => Array 
     (
      [shardProcessing] => 171 
      [postProcessing] => 17 
     ) 

    [shardCounts] => Array 
     (
      [someshard:27017] => Array 

Chúc may mắn, cho tôi biết nếu bạn cần một biến thể khác nhau!

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