Hướng dẫn dùng mongodb startswith trong PHP

Bài viết được sự cho phép của smartjob.vn

Nội dung chính

  • Tập tin info.php
  • Tập tin add.php
  • Tập tin find.php
  • Có gì mới trên MongoDB 4.0
  • Phiên bản Python
  • Phiên bản Java
  • Phiên họp
  • Nguyên tử
  • Tính nhất quán
  • Sự cách ly
  • Độ bền
  • Giao dịch và Bản sao
  • Công cụ giao dịch và lưu trữ
  • Thời gian giao dịch thống nhất
  • Tác động của giao dịch trên bộ nhớ cache
  • Đọc dưới dạng Dấu thời gian và Dấu thời gian cũ nhất
  • Khôi phục lớp động cơ và Dấu thời gian ổn định
  • Giao dịch phân tán

Nội dung chính

  • Tập tin info.php
  • Tập tin add.php
  • Tập tin find.php
  • Có gì mới trên MongoDB 4.0
  • Phiên bản Python
  • Phiên bản Java
  • Phiên họp
  • Nguyên tử
  • Tính nhất quán
  • Sự cách ly
  • Độ bền
  • Giao dịch và Bản sao
  • Công cụ giao dịch và lưu trữ
  • Thời gian giao dịch thống nhất
  • Tác động của giao dịch trên bộ nhớ cache
  • Đọc dưới dạng Dấu thời gian và Dấu thời gian cũ nhất
  • Khôi phục lớp động cơ và Dấu thời gian ổn định
  • Giao dịch phân tán

MongoDB hỗ trợ rất nhiều Driver cho các ngôn ngữ lập trình khác nhau. Trong bài viết này, SmartJob trình bày về việc kết nối, truy vấn từ PHP.

Máy tính sử dụng: Windows 10, 64 bit, sử dụng bộ tích hợp XAMPP.
Cài đặt MongoDB sử dụng MEAN stack [bạn xem các bài viết trước đã hướng dẫn cách cài đặt].

Việc làm php và việc làm mongoBD hấp dẫn

Bước 1. Tải về tập tin mở rộng dll tại đường link:

Bước 2. Giải nén. Copy file php_mongodb.dll  vào thư mục ext, ví dụ trên máy của tác giả là: C:\xampp\php\ext

Bước 3. Tìm file php.ini , ví dụ, trên máy tác giả là: C:\xampp\php\php.ini .

Chèn vào cuối tập tin này:

extension=php_mongodb.dll

Bước 4. Giả sử có thư mục: C:\xampp\htdocs\vy\mongophp
Sử dụng cmd:

Gõ lệnh:

composer require "mongodb/mongodb=^1.0.0"

để tải thư viện bằng Composer về.

Composer tự động tải về và thư mục có thêm 1 thư mục và 2 tập tin mới:

Tạo 3 tập tin info.phpadd.phpfind.php để kiểm tra các tính năng mà thư viện MongoDB PHP cung cấp:

Tập tin info.php

Tập tin add.php

Tập tin find.php

Bước 5. Khởi chạy máy chủ PHP dựng sẵn

php -S localhost:1111 -t C:\xampp\htdocs\vy\mongo-php

Bước 6. Truy cập

//localhost:1111/info.php

xem kết quả để thấy rằng extension MongoDB đã được cài đặt thành công trong PHP.

Bước 7. Thêm dữ liệu bằng cách truy cập đường dẫn

Bước 8. Tìm kiếm dữ liệu, bằng cách truy cập đường dẫn

Để thực hiện nhiều thao tác đa dạng khác [đọc, ghi, sửa, xóa], bạn hãy xem thêm tài liệu như bên dưới.

TÀI LIỆU THAM KHẢO

1. //php.net/manual/en/mongodb.installation.windows.php
2. //mongodb.github.io/mongo-php-library/api/class-MongoDB.Collection.html
3. //gist.github.com/gatesvp/977676

Tải mã nguồn từ server SmartJob: mongo-php
hoặc tải về/fork từ server Github: //github.com/SmartJobVN/mongo-php

Bài viết gốc được đăng tải tại smartjob.vn

Có thể bạn quan tâm:

  • Node.js và Mongodb hướng dẫn kết nối
  • MongoDB là gì? Định nghĩa đầy đủ và chi tiết nhất về MongoDB
  • Lập trình viên MongoDB các vị trí

Xem thêm tuyển dụng nhân viên it hấp dẫn trên TopDev

Vào cuối tháng trước, MongoDB World đã công bố phát hành MongoDB 4.0, hỗ trợ các giao dịch đa tài liệu chống lại các tập hợp bản sao. Các kỹ sư R&D của Cơ sở dữ liệu Alibaba Cloud ApsaraDB lần đầu tiên phân tích mã nguồn của các chức năng giao dịch và phân tích cú pháp cơ chế thực hiện giao dịch. Trong bài viết này, chúng tôi sẽ thảo luận về việc thực hiện các giao dịch đa tài liệu trên MongoDB 4.0.

Có gì mới trên MongoDB 4.0

Chức năng giao dịch được MongoDB 4.0 giới thiệu hỗ trợ các tính năng ACID đa tài liệu như các hoạt động giao dịch bằng cách sử dụng mongo shell.

> s = db.getMongo[].startSession[]
session { "id" : UUID["3bf55e90-5e88-44aa-a59e-a30f777f1d89"] }
> s.startTransaction[]
> db.coll01.insert[{x: 1, y: 1}]
WriteResult[{ "nInserted" : 1 }]
> db.coll02.insert[{x: 1, y: 1}]
WriteResult[{ "nInserted" : 1 }]
> s.commitTransaction[]  [or s.abortTransaction[] rollback transaction]

Các trình điều khiển ngôn ngữ khác hỗ trợ MongoDB 4.0 cũng đóng gói các API liên quan đến giao dịch. Để làm điều này, người dùng cần tạo Session, sau đó mở và cam kết giao dịch trên Session. Ví dụ:

Phiên bản Python

with client.start_session[] as s:
    s.start_transaction[]
    collection_one.insert_one[doc_one, session=s]
    collection_two.insert_one[doc_two, session=s]
    s.commit_transaction[]

Phiên bản Java

try [ClientSession clientSession = client.startSession[]] {
   clientSession.startTransaction[];
   collection.insertOne[clientSession, docOne];
   collection.insertOne[clientSession, docTwo];
   clientSession.commitTransaction[];
}

Phiên họp

Sessionlà một khái niệm được giới thiệu trong MongoDB 3.6. Tính năng này chủ yếu được sử dụng để đạt được các giao dịch đa tài liệu. Sessionvề cơ bản là một "ngữ cảnh".

Trong các phiên bản trước, MongoDB chỉ quản lý ngữ cảnh của một thao tác duy nhất. Quy mongodtrình dịch vụ nhận được một yêu cầu, tạo một ngữ cảnh cho yêu cầu [tương ứng với OperationContexttrong nguồn], và sau đó sử dụng ngữ cảnh trong suốt yêu cầu. Nội dung của ngữ cảnh bao gồm thống kê mức tiêu thụ thời gian của yêu cầu, khóa tài nguyên bị chiếm bởi yêu cầu, ảnh chụp nhanh bộ nhớ được yêu cầu sử dụng, v.v.

Với Session, bạn có thể có nhiều yêu cầu chia sẻ một ngữ cảnh duy nhất và nhiều yêu cầu có thể tương quan với nhau để hỗ trợ các giao dịch đa tài liệu.

Mỗi Sessionchứa một mã định danh duy nhất lsid . Trong phiên bản 4.0, mỗi yêu cầu của người dùng có thể chỉ định các trường mở rộng bổ sung, bao gồm:

  1. lsid: ID của phiên đặt yêu cầu, còn được gọi là id phiên logic.
  2. txnNmuber: Số giao dịch tương ứng với yêu cầu, phải được tăng đơn điệu trong một Phiên.
  3. stmtIds: Nó tương ứng với ID cho từng thao tác trong yêu cầu [trong trường hợp chèn, một lệnh chèn có thể chèn nhiều tài liệu].

Trên thực tế, người dùng khi giao dịch sử dụng cũng không cần tìm hiểu những chi tiết này vì chúng sẽ được MongoDB Driver tự động xử lý. Driver sẽ cấp phát lsid khi tạo Session. Sau đó Driver sẽ tự động thêm lsid vào tất cả các thao tác tiếp theo trong này Session. Đối với một hoạt động giao dịch, txnNumber sẽ tự động được thêm vào.

Điều đáng nói là lsid của Sessioncó thể được phân bổ bởi máy chủ bằng startSessionlệnh gọi , hoặc bởi máy khách, để lưu chi phí mạng. Đối với định danh giao dịch, MongoDB không cung cấp một startTransactionlệnh riêng biệt , txnNumber được chỉ định trực tiếp bởi Trình điều khiển. Trình điều khiển chỉ cần đảm bảo rằng trong một Phiên, txnNumber được tăng lên. Khi máy chủ nhận được một yêu cầu giao dịch mới, nó sẽ chủ động bắt đầu một giao dịch mới.

Khi MongoDB startSession, nó có thể chỉ định một loạt các tùy chọn để kiểm soát hành vi truy cập của Session, bao gồm:

  1. Tính nhất quán nhân quả : Cho dù có cung cấp ngữ nghĩa của tính nhất quán nhân quả hay không, nếu nó được đặt thành true, MongoDB đảm bảo ngữ nghĩa của "đọc bản viết của chính bạn" bất kể nút nào nó đọc. Xem tính nhất quán nhân quả
  2. writeConcern: MongoDB hỗ trợ các chính sách ghi cấu hình linh hoạt phía máy khách [ writeConcern ] để đáp ứng nhu cầu của các tình huống khác nhau.
  3. readConcern: MongoDB có thể tùy chỉnh chiến lược ghi thông qua writeConcern. Sau phiên bản 3.2, readConcern được giới thiệu để tùy chỉnh linh hoạt chiến lược đọc.
  4. readPreference: Quy tắc chọn các nút khi thiết lập đọc, xem tùy chọn đọc
  5. retryWrites: Nếu nó được đặt thành true, trong kịch bản của bộ bản sao, MongoDB sẽ tự động thử lại cảnh nơi xảy ra lựa chọn lại; xem ghi có thể thử lại

AXIT

Tính nguyên tử, tính nhất quán, tính cô lập và độ bền [ACID] là một tập hợp các thuộc tính cho các giao dịch cơ sở dữ liệu nhằm đảm bảo tính hợp lệ của các giao dịch trong mọi trường hợp. ACID đóng một vai trò thiết yếu đối với các giao dịch đa tài liệu.

Nguyên tử

Đối với các hoạt động giao dịch đa tài liệu, MongoDB cung cấp một đảm bảo ngữ nghĩa nguyên tử về "tất cả hoặc không có gì". Các thay đổi dữ liệu chỉ được hiển thị bên ngoài giao dịch nếu nó thành công. Khi một giao dịch không thành công, tất cả dữ liệu thay đổi từ giao dịch sẽ bị loại bỏ.

Tính nhất quán

Nhất quán là đơn giản. Chỉ cho phép các giao dịch được phép trên cơ sở dữ liệu, điều này ngăn chặn việc cơ sở dữ liệu bị hỏng bởi một giao dịch bất hợp pháp.

Sự cách ly

MongoDB cung cấp mức cô lập ảnh chụp nhanh, tạo ảnh chụp nhanh WiredTiger khi bắt đầu giao dịch và sau đó sử dụng ảnh chụp nhanh này để cung cấp các lần đọc giao dịch trong suốt giao dịch.

Độ bền

Khi một giao dịch sử dụng WriteConcern {j: true}, MongoDB sẽ đảm bảo rằng nó sẽ được trả lại sau khi ghi nhật ký giao dịch được cam kết. Ngay cả khi xảy ra sự cố, MongoDB có thể khôi phục theo nhật ký giao dịch. Nếu {j: true}cấp độ không được chỉ định, ngay cả sau khi giao dịch được cam kết thành công, sau khi khôi phục sự cố, giao dịch có thể được khôi phục lại.

Giao dịch và Bản sao

Trong cấu hình tập hợp bản sao, một oplog [một tài liệu bình thường, vì vậy việc sửa đổi giao dịch trong phiên bản hiện tại không được vượt quá giới hạn kích thước tài liệu là 16 MB] sẽ được ghi lại khi toàn bộ giao dịch MongoDB được cam kết, bao gồm tất cả các hoạt động trong Giao dịch. Nút nô lệ kéo oplog và phát lại cục bộ các hoạt động giao dịch.

Ví dụ về nhật ký giao dịch, chứa lsid , txnSố hoạt động giao dịch và tất cả nhật ký hoạt động trong giao dịch [trường applyOps]

"ts" : Timestamp[1530696933, 1], "t" : NumberLong[1], "h" : NumberLong["4217817601701821530"], "v" : 2, "op" : "c", "ns" : "admin.$cmd", "wall" : ISODate["2018-07-04T09:35:33.549Z"], "lsid" : { "id" : UUID["e675c046-d70b-44c2-ad8d-3f34f2019a7e"], "uid" : BinData[0,"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="] }, "txnNumber" : NumberLong[0], "stmtId" : 0, "prevOpTime" : { "ts" : Timestamp[0, 0], "t" : NumberLong[-1] }, "o" : { "applyOps" : [ { "op" : "i", "ns" : "test.coll2", "ui" : UUID["a49ccd80-6cfc-4896-9740-c5bff41e7cce"], "o" : { "_id" : ObjectId["5b3c94d4624d615ede6097ae"], "x" : 20000 } }, { "op" : "i", "ns" : "test.coll3", "ui" : UUID["31d7ae62-fe78-44f5-ba06-595ae3b871fc"], "o" : { "_id" : ObjectId["5b3c94d9624d615ede6097af"], "x" : 20000 } } ] } }

Toàn bộ quá trình chơi lại như sau:

  1. Nhận lô hiện tại [back-end tiếp tục kéo oplog vào lô]
  2. Đặt OplogTruncateAfterPointdấu thời gian thành dấu thời gian của oplog đầu tiên trong lô [được lưu trữ trong bộ local.replset.oplogTruncateAfterPoint]
  3. Ghi tất cả các oplog trong lô vào local.oplog.rs đã đặt. Nếu số lượng nhật ký lớn, tăng tốc ghi sẽ được sử dụng.
  4. Xóa OplogTruncateAfterPointvà đánh dấu oplog được viết hoàn toàn thành công. Nếu sự cố xảy ra trước khi bước này hoàn thành, sau khi khởi động lại và khôi phục, nó được tìm thấy đã oplogTruncateAfterPointđược thiết lập, thì oplog được cắt ngắn thành dấu thời gian để khôi phục trạng thái nhất quán.
  5. Oplog được chia thành nhiều luồng để phát lại đồng thời. Để cải thiện hiệu quả của đồng thời, oplog được tạo bởi giao dịch chứa tất cả các sửa đổi và sẽ được chia thành nhiều luồng theo ID tài liệu giống như oplog của một thao tác thông thường.
  6. Cập nhật ApplyThroughdấu thời gian thành dấu thời gian của oplog cuối cùng trong lô. Sau khi đánh dấu lần khởi động lại tiếp theo, hãy đồng bộ hóa lại từ vị trí đó. Nếu nó không thành công trước bước này, oplog sẽ được lấy từ giá trị cuối cùng của ApplyThrough[oplog cuối cùng của lô trước đó].
  7. Cập nhật dấu thời gian hiển thị oplog. Nếu các nút khác đồng bộ hóa từ nút phụ, phần này của oplog mới được viết có thể được đọc.
  8. Cập nhật ảnh chụp nhanh cục bộ [dấu thời gian] và bản ghi mới sẽ hiển thị cho người dùng.

Công cụ giao dịch và lưu trữ

Thời gian giao dịch thống nhất

WiredTiger đã hỗ trợ giao dịch trong một thời gian dài. Trong phiên bản 3.x, MongoDB sử dụng các giao dịch WiredTiger để đảm bảo tính nguyên tử của việc sửa đổi dữ liệu, chỉ mục và oplog. Nhưng trên thực tế, MongoDB cung cấp một API giao dịch sau nhiều lần lặp lại của nhiều phiên bản. Khó khăn cốt lõi là thời gian.

MongoDB sử dụng dấu thời gian oplog để xác định đơn hàng toàn cầu, trong khi WiredTiger sử dụng ID giao dịch nội bộ để xác định đơn hàng toàn cầu. Về mặt thực hiện, không có sự liên kết giữa hai điều này. Điều này dẫn đến một thứ tự cam kết giao dịch mà MongoDB thấy không nhất quán với thứ tự cam kết giao dịch mà WiredTiger thấy.

Để giải quyết vấn đề này, WiredTier 3.0 giới thiệu cơ chế dấu thời gian giao dịch. Ứng dụng có thể chỉ định rõ ràng dấu thời gian cam kết cho giao dịch WiredTiger thông qua WT_SESSION::timestamp_transactionAPI, sau đó đạt được dấu thời gian được chỉ định read [ read "as of" a timestamp]. Với read "as of" a timestamptính năng này, khi oplog được phát lại, việc đọc trên nút phụ sẽ không còn xung đột với oplog được phát lại và yêu cầu đọc sẽ không bị chặn bằng cách phát lại oplog. Đây là một cải tiến đáng kể trong phiên bản 4.0.

/*
 * __wt_txn_visible --
 *  Can the current transaction see the given ID / timestamp?
 */
static inline bool
__wt_txn_visible[
    WT_SESSION_IMPL *session, uint64_t id, const wt_timestamp_t *timestamp]
{
    if [!__txn_visible_id[session, id]]
        return [false];

    /* Transactions read their writes, regardless of timestamps. */
    if [F_ISSET[&session->txn, WT_TXN_HAS_ID] && id == session->txn.id]
        return [true];

#ifdef HAVE_TIMESTAMPS
    {
    WT_TXN *txn = &session->txn;

    /* Timestamp check. */
    if [!F_ISSET[txn, WT_TXN_HAS_TS_READ] || timestamp == NULL]
        return [true];

    return [__wt_timestamp_cmp[timestamp, &txn->read_timestamp] 

Chủ Đề