Đ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 SQLBạ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ẠIsố
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});0Dâ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});1Bâ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});2Bạ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});1và 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});2Mả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});3Một ví dụ về truy vấn cho một phạm vi ngày
$coll->insert({_id => 1});4Cả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});6Biể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});7Lư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});8Mộ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});9Hầ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 } }1Dữ 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 } }3MongoDB. 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 } }4So 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 } }5Hoặc, với phạm vi
> db.whatever.findOne() { "_id" : { "floatApprox" : 1 } }6Cá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 } }7MongoDB. 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 } }8MongoDB. dấu thời gian
> db.whatever.findOne() { "_id" : { "floatApprox" : 1 } }9Dấ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});0Trong 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});1Dấ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
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});21 Lỗi POD
Đã gặp phải các lỗi sau khi phân tích cú pháp POD
Xung quanh đường 174Ký 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});3vỏ 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