MongoDB chuyển đổi nhị phân thành chuỗi

Điều này đi qua các loại bạn có thể lưu vào cơ sở dữ liệu và sử dụng cho các truy vấn trong trình điều khiển Perl. Nếu bạn đang sử dụng ngôn ngữ khác, vui lòng tham khảo tài liệu của ngôn ngữ đó (http. //api. mongodb. tổ chức)

LƯU Ý CHO LẬP TRÌNH SQL

Bạn phải truy vấn dữ liệu bằng đúng loại

Ví dụ: hoàn toàn hợp lệ khi có một số bản ghi trong đó trường "foo" là 123 (số nguyên) và các bản ghi khác trong đó "foo" là "123" (chuỗi). Vì vậy, bạn phải truy vấn đúng loại. Nếu bạn lưu

    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});
5, bạn không thể truy vấn nó với
    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});
6. MongoDB nghiêm ngặt về các loại

Nếu loại trường không rõ ràng và quan trọng đối với ứng dụng của bạn, bạn nên ghi lại những gì bạn muốn ứng dụng gửi đến cơ sở dữ liệu và chuyển đổi dữ liệu của bạn thành các loại đó trước khi gửi. Có một số trình ánh xạ tài liệu đối tượng sẽ thực thi một số loại nhất định cho các trường nhất định cho bạn

Thông thường, bạn không nên lưu số dưới dạng chuỗi, vì chúng sẽ hoạt động giống như chuỗi (e. g. , truy vấn phạm vi sẽ không hoạt động chính xác) và dữ liệu sẽ chiếm nhiều dung lượng hơn. Nếu bạn đặt , trình điều khiển sẽ tự động chuyển đổi mọi thứ trông giống số thành số trước khi gửi vào cơ sở dữ liệu

Các số là ngoại lệ duy nhất đối với việc gõ nghiêm ngặt. tất cả các loại số được lưu trữ bởi MongoDB (số nguyên 32 bit, số nguyên 64 bit, số dấu phẩy động 64 bit) sẽ khớp với nhau

CÁC LOẠI

số

Theo mặc định, các số có dấu thập phân sẽ được lưu dưới dạng số kép (64-bit)

Nền tảng 32-bit

Các số không có dấu thập phân sẽ được lưu dưới dạng số nguyên 32 bit. Để lưu một số dưới dạng số nguyên 64 bit, hãy sử dụng bigint

    use bigint;

    $collection->insert({"user_id" => 28347197234178})

Trình điều khiển sẽ chết nếu bạn cố chèn một số vượt quá phạm vi 64 bit đã ký. -9.223.372.036.854.775.808 đến +9.223.372.036.854.775.807

Các số được lưu dưới dạng số nguyên 64 bit sẽ được giải mã thành gấp đôi

Nền tảng 64-bit

Các số không có dấu thập phân sẽ được lưu và trả về dưới dạng số nguyên 64 bit. Lưu ý rằng không có cách nào để lưu int 32 bit trên máy 64 bit

Hãy nhớ rằng điều này có thể gây ra một số điều kỳ lạ nếu một số máy là 32-bit và những máy khác là 64-bit. Lấy ví dụ sau

  • Lập trình viên 1 lưu một int trên nền tảng 32-bit

  • Lập trình viên 2 truy xuất tài liệu trên nền tảng 64-bit và lưu lại nó, chuyển đổi nó thành int 64-bit một cách hiệu quả

  • Lập trình viên 1 truy xuất tài liệu trên máy 32 bit của họ, máy này giải mã int 64 bit dưới dạng gấp đôi

Không có gì quyết liệt, nhưng tốt để nhận thức được

Số nguyên 64 bit trong trình bao

Vỏ Mongo có một loại số. float 8 byte. Điều này có nghĩa là nó không phải lúc nào cũng biểu diễn chính xác một số nguyên 8 byte. Do đó, khi bạn hiển thị một số nguyên 64 bit trong trình bao, nó sẽ được bao bọc trong một đối tượng con cho biết đó có thể là một giá trị gần đúng. Chẳng hạn, nếu chúng ta chạy Perl này trên máy 64-bit

    $coll->insert({_id => 1});

sau đó nhìn vào nó trong vỏ, chúng ta thấy

    > db.whatever.findOne()
    {
        "_id" :
            {
                "floatApprox" : 1
            }
    }

Điều này không có nghĩa là chúng tôi đã lưu số float, nó chỉ có nghĩa là giá trị float của số nguyên 64 bit có thể không chính xác

Xử lý các số và chuỗi trong Perl

Perl rất linh hoạt về việc thứ gì đó là số hay chuỗi. nó thường suy ra loại từ ngữ cảnh. Thật không may, trình điều khiển không có bất kỳ ngữ cảnh nào khi phải chọn cách tuần tự hóa một biến. Do đó, hành vi mặc định là xem xét nội quan các cờ được đặt trên biến đó và quyết định ý nghĩa của người dùng, thường bị ảnh hưởng bởi thao tác cuối cùng

    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});

Vì điều này, người dùng thường thấy rằng họ kết thúc với nhiều chuỗi hơn họ muốn trong cơ sở dữ liệu của họ

Nếu bạn muốn mọi thứ trông giống như một số được lưu dưới dạng một số, hãy đặt tùy chọn

    $MongoDB::BSON::looks_like_number = 1;

    my $var = "4";
    # stored as the int 4
    $collection->insert({myVar => $var});

Điều này sẽ gửi bất cứ thứ gì "trông giống" một số dưới dạng một số. Nó có thể nhận ra bất cứ thứ gì mà Scalar. Hàm

    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});
7 của Util có thể nhận ra

Mặt khác, đôi khi có dữ liệu giống số nhưng nên lưu dưới dạng chuỗi. Ví dụ: giả sử chúng tôi đang lưu mã zip. Nếu chúng ta thường muốn chuyển đổi chuỗi thành số, chúng ta có thể có một cái gì đó như

________số 8

Để buộc một "số" được lưu dưới dạng một chuỗi có bật tính năng chuyển đổi số tích cực, hãy nhập chuỗi dưới dạng loại

    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});
8

    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});
0

Dây

Tất cả các chuỗi phải là UTF-8 hợp lệ để được gửi đến cơ sở dữ liệu. Nếu một chuỗi không hợp lệ, nó sẽ không được lưu. Nếu bạn cần lưu một chuỗi không phải UTF-8, bạn có thể lưu nó dưới dạng blob nhị phân (xem phần Dữ liệu nhị phân bên dưới)

Tất cả các chuỗi được trả về từ cơ sở dữ liệu đều được đặt cờ UTF-8

Thật không may, do sự kỳ lạ của Perl, UTF-8 không đẹp lắm. Ví dụ: giả sử chúng ta có chuỗi UTF-8

    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});
1

Bây giờ, hãy in nó

    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});
2

Bạn có thể thấy trong đầu ra

    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});
3

Đáng yêu phải không? . Để làm cho nó "đẹp", có một vài lựa chọn

    $coll->insert({_id => 1});
0

Điều này vô tình xóa cờ UTF-8

Bạn cũng có thể chỉ cần chạy

    $coll->insert({_id => 1});
1

và sau đó chuỗi (và tất cả các chuỗi UTF-8 trong tương lai) sẽ in "chính xác. "

Bạn cũng có thể tắt

    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});
9 và cờ UTF-8 sẽ không được đặt khi chuỗi được giải mã

    $coll->insert({_id => 1});
2

Mảng

Mảng phải được lưu dưới dạng tham chiếu mảng (

    $MongoDB::BSON::looks_like_number = 1;

    my $var = "4";
    # stored as the int 4
    $collection->insert({myVar => $var});
0, không phải
    $MongoDB::BSON::looks_like_number = 1;

    my $var = "4";
    # stored as the int 4
    $collection->insert({myVar => $var});
1)

Tài liệu nhúng

Tài liệu nhúng có cùng dạng với tài liệu cấp cao nhất. tham chiếu băm hoặc Tie. IxHash

ngày

Gói DateTime có thể được sử dụng chèn và truy vấn ngày tháng. Ngày được lưu trữ trong cơ sở dữ liệu sẽ được trả về dưới dạng phiên bản của DateTime

Một ví dụ về lưu trữ và truy xuất ngày tháng

    $coll->insert({_id => 1});
3

Một ví dụ về truy vấn cho một phạm vi ngày

    $coll->insert({_id => 1});
4

Cảnh báo. tạo các đối tượng Perl DateTime cực kỳ chậm. Cân nhắc lưu ngày dưới dạng số và chuyển đổi số thành DateTimes khi cần. Một trường DateTime duy nhất có thể làm cho quá trình giải tuần tự hóa chậm hơn tới 10 lần

Ví dụ: bạn có thể sử dụng hàm thời gian để lưu trữ giây kể từ kỷ nguyên

    $coll->insert({_id => 1});
5

Điều này sẽ nhanh hơn để deserialize

Biểu thức chính quy

Sử dụng

    $MongoDB::BSON::looks_like_number = 1;

    my $var = "4";
    # stored as the int 4
    $collection->insert({myVar => $var});
2 để sử dụng biểu thức chính quy trong truy vấn

    $coll->insert({_id => 1});
6

Biểu thức chính quy sẽ khớp với các chuỗi được lưu trong cơ sở dữ liệu

Bạn cũng có thể tự lưu và truy xuất các biểu thức chính quy

    $coll->insert({_id => 1});
7

Lưu ý cho Perl 5. 8 người dùng. cờ bị mất khi biểu thức chính quy được lấy từ cơ sở dữ liệu (điều này không ảnh hưởng đến truy vấn hoặc Perl 5. 10+)

Booleans

Sử dụng gói boolean để nhận các giá trị boolean.

    $MongoDB::BSON::looks_like_number = 1;

    my $var = "4";
    # stored as the int 4
    $collection->insert({myVar => $var});
3 và
    $MongoDB::BSON::looks_like_number = 1;

    my $var = "4";
    # stored as the int 4
    $collection->insert({myVar => $var});
4 là những phần duy nhất của gói được sử dụng, hiện tại

Một ví dụ về chèn giá trị boolean

    $coll->insert({_id => 1});
8

Một ví dụ sử dụng giá trị boolean cho toán tử truy vấn (chỉ trả về tài liệu có trường tên tồn tại)

    $coll->insert({_id => 1});
9

Hầu hết thời gian, bạn chỉ có thể sử dụng 1 hoặc 0 thay vì

    $MongoDB::BSON::looks_like_number = 1;

    my $var = "4";
    # stored as the int 4
    $collection->insert({myVar => $var});
5 và
    $MongoDB::BSON::looks_like_number = 1;

    my $var = "4";
    # stored as the int 4
    $collection->insert({myVar => $var});
6, chẳng hạn như để chỉ định các trường sẽ trả lại. boolean là cách duy nhất để lưu boolean vào cơ sở dữ liệu

Theo mặc định, các phép toán luận được trả về từ cơ sở dữ liệu dưới dạng số nguyên. Để trả về boolean dưới dạng boolean, hãy đặt

    $MongoDB::BSON::looks_like_number = 1;

    my $var = "4";
    # stored as the int 4
    $collection->insert({myVar => $var});
7 thành 1

MongoDB. OID

"OID" là viết tắt của "ID đối tượng" và là một id duy nhất được tự động thêm vào tài liệu nếu chúng chưa có trường

    $MongoDB::BSON::looks_like_number = 1;

    my $var = "4";
    # stored as the int 4
    $collection->insert({myVar => $var});
8 trước khi chúng được lưu vào cơ sở dữ liệu. Chúng là 12 byte được đảm bảo là duy nhất. Dạng mạnh của chúng là một chuỗi 24 ký tự gồm các chữ số thập lục phân

Để tạo một id duy nhất

    > db.whatever.findOne()
    {
        "_id" :
            {
                "floatApprox" : 1
            }
    }
0

Để tạo một MongoDB. OID từ chuỗi thập lục phân 24 ký tự hiện có

    > db.whatever.findOne()
    {
        "_id" :
            {
                "floatApprox" : 1
            }
    }
1

Dữ liệu nhị phân

Theo mặc định, tất cả các chuỗi cơ sở dữ liệu là UTF8. Để lưu hình ảnh, tệp nhị phân và dữ liệu không phải UTF8 khác, bạn cần lưu trữ dưới dạng dữ liệu nhị phân. Có hai cách để làm điều này

Tham chiếu chuỗi

Nói chung, bạn có thể chuyển chuỗi dưới dạng tham chiếu. Ví dụ

    > db.whatever.findOne()
    {
        "_id" :
            {
                "floatApprox" : 1
            }
    }
2

Điều này sẽ lưu biến dưới dạng dữ liệu nhị phân, bỏ qua kiểm tra UTF8

Dữ liệu nhị phân có thể được khớp chính xác bởi cơ sở dữ liệu, vì vậy truy vấn này sẽ khớp với đối tượng chúng tôi đã chèn ở trên

    > db.whatever.findOne()
    {
        "_id" :
            {
                "floatApprox" : 1
            }
    }
3

MongoDB. BSON. loại nhị phân

Bạn cũng có thể sử dụng MongoDB. BSON. lớp nhị phân. Điều này cho phép bạn bảo toàn kiểu con của dữ liệu của mình. Dữ liệu nhị phân trong MongoDB lưu trữ trường "loại", có thể là bất kỳ số nguyên nào trong khoảng từ 0 đến 255. Dữ liệu giống hệt nhau sẽ chỉ khớp nếu kiểu con giống nhau

Perl sử dụng kiểu con mặc định của

    $MongoDB::BSON::looks_like_number = 1;

    my $var = "4";
    # stored as the int 4
    $collection->insert({myVar => $var});
9

Trình điều khiển mặc định trả về dữ liệu nhị phân dưới dạng chuỗi, không phải phiên bản của MongoDB. BSON. Nhị phân (hoặc thậm chí tham chiếu chuỗi) vì lý do tương thích ngược. Nếu bạn cần dữ liệu nhị phân khứ hồi, hãy đặt cờ

    $MongoDB::BSON::looks_like_number = 1;

    # zip is stored as an int: 4101
    $collection->insert({city => "Portland", "zip" => "04101"});
0

    > db.whatever.findOne()
    {
        "_id" :
            {
                "floatApprox" : 1
            }
    }
4

So sánh (e. g. , $gt, $lt) có thể không hoạt động như bạn mong đợi với dữ liệu nhị phân, vì vậy rất đáng để thử nghiệm

MongoDB. Mã số

MongoDB. Mã được sử dụng để đại diện cho mã JavaScript và, tùy chọn, phạm vi. Để tạo một

    > db.whatever.findOne()
    {
        "_id" :
            {
                "floatApprox" : 1
            }
    }
5

Hoặc, với phạm vi

    > db.whatever.findOne()
    {
        "_id" :
            {
                "floatApprox" : 1
            }
    }
6

Cái nào sau đó sẽ trả về "xin chào, Fred" khi chạy

MongoDB. MinKey

    $MongoDB::BSON::looks_like_number = 1;

    # zip is stored as an int: 4101
    $collection->insert({city => "Portland", "zip" => "04101"});
1 là "nhỏ hơn" bất kỳ giá trị nào khác thuộc bất kỳ loại nào. Điều này có thể hữu ích cho việc luôn trả lại một số tài liệu nhất định trước (hoặc cuối cùng)

    $MongoDB::BSON::looks_like_number = 1;

    # zip is stored as an int: 4101
    $collection->insert({city => "Portland", "zip" => "04101"});
1 không có phương thức, trường hoặc dạng chuỗi. Để tạo một cái, chỉ cần nói

    > db.whatever.findOne()
    {
        "_id" :
            {
                "floatApprox" : 1
            }
    }
7

MongoDB. MaxKey

    $MongoDB::BSON::looks_like_number = 1;

    # zip is stored as an int: 4101
    $collection->insert({city => "Portland", "zip" => "04101"});
3 là "lớn hơn" bất kỳ giá trị nào khác thuộc bất kỳ loại nào. Điều này có thể hữu ích để luôn trả lại một số tài liệu cuối cùng (hoặc đầu tiên)

    $MongoDB::BSON::looks_like_number = 1;

    # zip is stored as an int: 4101
    $collection->insert({city => "Portland", "zip" => "04101"});
3 không có phương thức, trường hoặc dạng chuỗi. Để tạo một cái, chỉ cần nói

    > db.whatever.findOne()
    {
        "_id" :
            {
                "floatApprox" : 1
            }
    }
8

MongoDB. dấu thời gian

    > db.whatever.findOne()
    {
        "_id" :
            {
                "floatApprox" : 1
            }
    }
9

Dấu thời gian được sử dụng nội bộ bởi bản sao của MongoDB. Bạn có thể nhìn thấy chúng trong môi trường sống tự nhiên của chúng bằng cách truy vấn

    $MongoDB::BSON::looks_like_number = 1;

    # zip is stored as an int: 4101
    $collection->insert({city => "Portland", "zip" => "04101"});
5. Mỗi mục trông giống như

    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});
0

Trong trình bao, dấu thời gian được hiển thị bằng mili giây, mặc dù chúng được lưu trữ dưới dạng giây. Vì vậy, để thể hiện tài liệu này trong Perl, chúng tôi sẽ làm

    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});
1

Dấu thời gian không phải là ngày tháng. Bạn không nên sử dụng chúng trừ khi bạn đang làm điều gì đó ở cấp độ thấp với bản sao. Để lưu ngày hoặc giờ, hãy sử dụng một số hoặc DateTime

TÁC GIẢ
  • Florian Ragwitz

  • Kristina Chodorow

  • Mike Friedman

BẢN QUYỀN VÀ GIẤY PHÉP

Phần mềm này là Bản quyền (c) 2012 của 10gen, Inc

Đây là phần mềm miễn phí, được cấp phép theo

    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});
2

1 Lỗi POD

Đã gặp phải các lỗi sau khi phân tích cú pháp POD

Xung quanh đường 174

Ký tự không phải ASCII đã thấy trước =encoding in ''Åland'. Giả sử UTF-8

×

Hướng dẫn cài đặt mô-đun

Để cài đặt MongoDB. Không đồng bộ, sao chép và dán lệnh thích hợp vào thiết bị đầu cuối của bạn

cpanm

    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});
3

vỏ CPAN

    my $var = "4";
    # stored as the string "4"
    $collection->insert({myVar => $var});

    $var = int($var) if (int($var) eq $var);
    # stored as the int 4
    $collection->insert({myVar => $var});
4

Để biết thêm thông tin về cài đặt mô-đun, vui lòng truy cập hướng dẫn cài đặt mô-đun CPAN chi tiết

Làm cách nào để chuyển đổi đối tượng thành chuỗi trong MongoDB?

toString() — Hướng dẫn sử dụng MongoDB. .
Tạo một ObjectId() mới và lưu trữ nó trong biến myObjectId
Tạo một biểu diễn chuỗi của myObjectId bằng phương thức toString()
Lưu trữ biểu diễn chuỗi trong biến myObjectIdString

Làm cách nào để chuyển đổi int thành chuỗi trong MongoDB?

forEach( function(x) { x. tên = x. tên. toNumber(). toString();

Làm cách nào để chuyển đổi UUID thành chuỗi trong MongoDB?

UUID(). toString() sẽ cung cấp một chuỗi chứa UUID("00000000-0000-0000-0000-00000000000"). split('"') sẽ chia chuỗi, chia cho dấu ngoặc kép, thành một mảng, đó là ['UUID(', '00000000-0000-0000-0000-000000000000', ')'].

Làm cách nào để chuyển đổi kiểu dữ liệu trong MongoDB?

Trong MongoDB, bạn có thể sử dụng toán tử đường ống tổng hợp $convert để chuyển đổi một giá trị thành một loại được chỉ định . Bạn có thể chuyển đổi bất kỳ biểu thức hợp lệ nào thành kép, chuỗi, ObjectId, boolean, Ngày, số nguyên, dài hoặc thập phân. Không phải tất cả các loại có thể được chuyển đổi sang bất kỳ loại nào khác.