MongoDB thay đổi khóa phân đoạn

Bạn chọn khóa phân đoạn khi phân đoạn bộ sưu tập. Mỗi bản ghi chứa một khóa phân đoạn và khóa phân đoạn là một trường được lập chỉ mục hoặc các trường phức hợp được lập chỉ mục. Cơ sở dữ liệu MongoDB phân phối dữ liệu theo các khối khác nhau theo khóa phân đoạn và phân phối các khối đồng đều giữa các phân đoạn. Để phân chia khối dữ liệu theo khóa phân đoạn, cơ sở dữ liệu MongoDB sử dụng hai phương thức phân đoạn. sharding dựa trên phạm vi và sharding băm

Bảng 1 Phân loại khóa Shard

Loại khóa mảnh

Sự miêu tả

Kịch bản ứng dụng

Bảo vệ dựa trên phạm vi

Phân đoạn dựa trên phạm vi liên quan đến việc chia dữ liệu thành các phạm vi liền kề được xác định bởi các giá trị khóa phân đoạn. Bảo vệ dựa trên phạm vi là phương pháp bảo vệ mặc định nếu không có tùy chọn nào khác được chỉ định

Điều này cho phép các truy vấn hiệu quả khi đọc các tài liệu đích trong một phạm vi liền kề. Tuyến phân phối xác định đoạn dữ liệu nào lưu trữ dữ liệu được yêu cầu và chuyển tiếp yêu cầu đến phân đoạn tương ứng

Nên sử dụng khi khóa phân đoạn có số lượng thẻ cao với tần số thấp và giá trị khóa phân đoạn không thay đổi đơn điệu

băm nhỏ

Bảo vệ băm đã băm sử dụng chỉ mục đã băm để phân vùng dữ liệu trên cụm được chia sẻ của bạn và để tạo các khối

Phân đoạn băm cung cấp phân phối dữ liệu đồng đều hơn trên cụm phân đoạn Giá trị băm cho phép dữ liệu được phân phối ngẫu nhiên trong mỗi đoạn và do đó được phân phối ngẫu nhiên trong các phân đoạn khác nhau

Nếu các giá trị khóa phân đoạn có số lượng thẻ cao hoặc thay đổi đơn điệu hoặc có số lượng lớn các giá trị khác nhau, thì phân đoạn băm là một lựa chọn lý tưởng

Khi bạn phân đoạn một bộ sưu tập, khóa phân đoạn và các giá trị của khóa phân đoạn là bất biến. Nếu bạn cần sửa đổi khóa phân đoạn của tài liệu, bạn phải xóa tài liệu đó. Sau đó sửa đổi khóa phân đoạn và chèn lại tài liệu

MongoDB thay đổi khóa phân đoạn

Khóa phân đoạn không hỗ trợ chỉ mục mảng, chỉ mục văn bản, chỉ mục địa lý và chỉ mục không gian

Sharding dựa trên phạm vi

  1. Chạy lệnh sau để kích hoạt cơ sở dữ liệu sharding

    sh. enableSharding (cơ sở dữ liệu)

    MongoDB thay đổi khóa phân đoạn

    cơ sở dữ liệu cho biết cơ sở dữ liệu đã kích hoạt bộ sưu tập phân mảnh

  2. Định cấu hình khóa phân đoạn của bộ sưu tập

    sh. shardCollection(không gian tên, khóa)

    MongoDB thay đổi khóa phân đoạn

    • không gian tên bao gồm một chuỗi. chỉ định không gian tên đầy đủ của bộ sưu tập đích
    • key chỉ ra chỉ mục cho shard key

    • Nếu bộ sưu tập trống, hãy bỏ qua bước này vì chỉ mục trên khóa phân đoạn có thể được tạo tự động

      sh. shardCollection()

    • Nếu bộ sưu tập không trống, hãy tạo khóa chỉ mục. Sau đó, chạy lệnh sau để đặt khóa phân đoạn

      sh. shardCollection()

Sharding băm

  1. Chạy lệnh sau để kích hoạt cơ sở dữ liệu sharding

    sh. enableSharding (cơ sở dữ liệu)

    MongoDB thay đổi khóa phân đoạn

    cơ sở dữ liệu cho biết cơ sở dữ liệu đã kích hoạt bộ sưu tập phân mảnh

  2. Đặt các khóa phân đoạn được băm

    sh. shardCollection(". ", {. "đã băm" }, sai, {numInitialChunks. Số khối cấu hình sẵn})

    Giá trị của numInitialChunks được tính như sau. db. thu thập. thống kê(). kích thước / 10*1024*1024*1024

    Nếu bộ sưu tập chứa dữ liệu, hãy chạy lệnh sau để tạo chỉ mục được băm cho khóa được băm

    Khóa phân đoạn là một trường được lập chỉ mục hoặc các trường phức hợp được lập chỉ mục xác định việc phân phối các tài liệu của bộ sưu tập giữa các phân đoạn của cụm

    Cụ thể, MongoDB chia khoảng giá trị khóa phân đoạn (hoặc giá trị khóa phân đoạn được băm) thành các phạm vi giá trị khóa phân đoạn không trùng lặp (hoặc giá trị khóa phân đoạn được băm). Mỗi phạm vi được liên kết với một đoạn và MongoDB cố gắng phân phối các đoạn đồng đều giữa các phân đoạn trong cụm

    MongoDB thay đổi khóa phân đoạn

    Khóa phân đoạn có mối quan hệ trực tiếp với hiệu quả của phân phối khối. Nhìn thấy

    Chọn khóa phân đoạn

    Thông số kỹ thuật chính của Shard

    Bạn phải chỉ định khóa phân đoạn khi phân đoạn bộ sưu tập. Bạn có thể sử dụng phương thức shell

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    2
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    3 để phân tách bộ sưu tập

    sh.shardCollection(<namespace>, <key>) // Optional parameters omitted

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    4

    Specify the full namespace of the collection (i.e. ".") to shard.

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    5

    Chỉ định một tài liệu

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    6 nơi

    • db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      7 biểu thị phân đoạn dựa trên phạm vi

    • db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      8 biểu thị sharding băm

    Ghi chú

    Các trường và giá trị khóa của Shard

    tồn tại

    Bắt đầu từ phiên bản 4. 4, tài liệu trong bộ sưu tập phân đoạn có thể thiếu các trường khóa phân đoạn. Khóa phân đoạn bị thiếu nằm trong cùng phạm vi với khóa phân đoạn có giá trị

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    0. Xem Thiếu khóa Shard.

    Trong phiên bản 4. 2 trở về trước, các trường khóa phân đoạn phải tồn tại trong mọi tài liệu đối với bộ sưu tập được phân đoạn

    Cập nhật giá trị của trường

    Bắt đầu từ MongoDB 4. 2, bạn có thể cập nhật giá trị khóa phân đoạn của tài liệu trừ khi trường khóa phân đoạn là trường

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    1 bất biến. Trước MongoDB 4. 2, giá trị trường khóa phân đoạn của tài liệu là không thay đổi

    Để biết chi tiết về cách cập nhật khóa phân đoạn, hãy xem Thay đổi giá trị khóa phân đoạn của tài liệu.

    Để biết thêm thông tin về phương pháp sharding, xem

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    3

    Tinh chỉnh khóa Shard

    Bắt đầu từ MongoDB 4. 4, bạn có thể sử dụng

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    3 để tinh chỉnh khóa phân đoạn của bộ sưu tập.
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    3 thêm trường hậu tố hoặc các trường vào khóa hiện có để tạo khóa phân đoạn mới

    Ví dụ: bạn có thể có bộ sưu tập

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    5 hiện có với khóa phân đoạn
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    6. Bạn có thể thay đổi khóa phân đoạn bằng cách thêm trường hậu tố
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    7 vào khóa phân đoạn để
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    8 trở thành khóa phân đoạn mới. Để biết thêm thông tin, hãy xem lệnh
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    3

    Việc tinh chỉnh khóa phân đoạn của bộ sưu tập cho phép phân phối dữ liệu chi tiết hơn và có thể giải quyết các tình huống trong đó khóa hiện có dẫn đến khối lượng lớn (i. e. không thể chia được) khối do không đủ lực lượng

    Trong MongoDB 4. 2 trở về trước, không thể thay đổi lựa chọn khóa phân đoạn sau khi phân đoạn

    Chỉ mục chính của Shard

    Tất cả các bộ sưu tập được phân đoạn phải có một chỉ mục hỗ trợ khóa phân đoạn; . e. chỉ mục có thể là một chỉ mục trên khóa phân đoạn hoặc chỉ mục tổng hợp trong đó khóa phân đoạn là tiền tố của chỉ mục

    • Nếu bộ sưu tập trống,

      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      3 sẽ tạo chỉ mục trên khóa phân đoạn nếu chỉ mục đó chưa tồn tại

    • Nếu bộ sưu tập không trống, bạn phải tạo chỉ mục trước khi sử dụng

      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      3

    Nếu bạn đánh rơi chỉ mục hợp lệ cuối cùng cho khóa phân đoạn, hãy khôi phục bằng cách tạo lại chỉ mục chỉ trên khóa phân đoạn

    Chỉ mục duy nhất

    MongoDB có thể thực thi ràng buộc về tính duy nhất đối với chỉ mục khóa phân đoạn phạm vi. Thông qua việc sử dụng một chỉ mục duy nhất trên khóa phân đoạn, MongoDB thực thi tính duy nhất trên toàn bộ tổ hợp phím chứ không phải các thành phần riêng lẻ của khóa phân đoạn

    Đối với một bộ sưu tập được phân đoạn theo phạm vi, chỉ các chỉ mục sau có thể là duy nhất

    • chỉ mục trên khóa phân đoạn

    • một chỉ mục phức hợp trong đó khóa phân đoạn là tiền tố

    • chỉ mục

      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      1 mặc định;

      Quan trọng

      Tính duy nhất và chỉ số _id

      Nếu trường

      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      1 không phải là khóa phân đoạn hoặc tiền tố của khóa phân đoạn, thì chỉ mục
      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      1 chỉ thực thi ràng buộc về tính duy nhất trên mỗi phân đoạn chứ không phải trên các phân đoạn

      Ví dụ: hãy xem xét một bộ sưu tập phân đoạn (với khóa phân đoạn

      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      57) bao gồm hai phân đoạn A và B. Vì khóa
      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      1 không phải là một phần của khóa phân đoạn, bộ sưu tập có thể có một tài liệu có giá trị
      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      1
      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      7 trong phân đoạn A và một tài liệu khác có giá trị
      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      1
      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      7 trong phân đoạn B

      Nếu trường

      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      1 không phải là khóa phân đoạn cũng không phải là tiền tố của khóa phân đoạn, thì MongoDB mong muốn các ứng dụng thực thi tính duy nhất của các giá trị
      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      1 trên các phân đoạn

    Các ràng buộc chỉ mục duy nhất có nghĩa là

    • Đối với bộ sưu tập sắp được phân đoạn, bạn không thể phân đoạn bộ sưu tập nếu bộ sưu tập có các chỉ mục duy nhất khác

    • Đối với một bộ sưu tập đã được chia nhỏ, bạn không thể tạo các chỉ mục duy nhất trên các trường khác

    • Chỉ mục duy nhất lưu trữ giá trị null cho tài liệu thiếu trường được lập chỉ mục; . Để biết thêm thông tin, hãy xem Chỉ mục duy nhất và Trường bị thiếu

    Để thực thi tính duy nhất trên các giá trị khóa phân đoạn, hãy chuyển tham số

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    26 là
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    27 cho phương thức
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    3

    • Nếu bộ sưu tập trống,

      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      3 sẽ tạo chỉ mục duy nhất trên khóa phân đoạn nếu chỉ mục đó chưa tồn tại

    • Nếu bộ sưu tập không trống, bạn phải tạo chỉ mục trước khi sử dụng

      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      3

    Mặc dù bạn có thể có một chỉ mục hợp chất duy nhất trong đó khóa phân đoạn là tiền tố, nhưng nếu sử dụng tham số

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    26, bộ sưu tập phải có một chỉ mục duy nhất nằm trên khóa phân đoạn

    Bạn không thể chỉ định một ràng buộc duy nhất trên chỉ mục được băm

    Chọn khóa phân đoạn

    Việc lựa chọn khóa phân đoạn ảnh hưởng đến việc tạo và phân phối các khối trên các phân đoạn có sẵn. Điều này ảnh hưởng đến hiệu quả tổng thể và hiệu suất của các hoạt động trong cụm phân đoạn

    Khóa phân đoạn lý tưởng cho phép MongoDB phân phối tài liệu đồng đều trên toàn cụm. Xem thêm chiến lược sharding

    Tối thiểu, hãy xem xét hậu quả của số lượng , tần suất, and monotonicity of a potential shard key.

    Ghi chú

    • Bắt đầu từ MongoDB 4. 4, bạn có thể sử dụng

      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      3 để tinh chỉnh khóa phân đoạn của bộ sưu tập.
      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      3 thêm trường hậu tố hoặc các trường vào khóa hiện có để tạo khóa phân đoạn mới

    • Trong MongoDB 4. 2 trở về trước, khi bạn phân đoạn một bộ sưu tập, việc lựa chọn khóa phân đoạn là không thay đổi

    Những hạn chế

    Để biết các hạn chế đối với khóa phân đoạn, hãy xem Hạn chế của khóa phân đoạn

    Kích thước bộ sưu tập

    Khi phân đoạn bộ sưu tập không trống, khóa phân đoạn có thể giới hạn kích thước bộ sưu tập được hỗ trợ tối đa chỉ cho thao tác phân đoạn ban đầu. Xem Sharding Kích thước dữ liệu bộ sưu tập hiện có

    Quan trọng

    Một bộ sưu tập được phân đoạn có thể phát triển thành bất kỳ kích thước nào sau khi phân đoạn thành công

    Shard Key Cardinality

    Số lượng thẻ của khóa phân đoạn xác định số khối tối đa mà bộ cân bằng có thể tạo. Điều này có thể làm giảm hoặc loại bỏ hiệu quả của tỷ lệ ngang trong cụm

    Một giá trị khóa phân đoạn duy nhất có thể tồn tại không quá một đoạn tại bất kỳ thời điểm nào. Nếu một khóa phân đoạn có số lượng thẻ là ________ 334, thì không thể có nhiều hơn ________ 334 khối trong cụm được phân đoạn, mỗi khối lưu trữ một giá trị khóa phân đoạn duy nhất. Điều này cũng hạn chế số lượng phân đoạn hiệu quả trong cụm thành

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    34 - việc thêm các phân đoạn bổ sung sẽ không mang lại bất kỳ lợi ích nào

    Hình ảnh sau đây minh họa một cụm phân đoạn sử dụng trường

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    37 làm khóa phân đoạn. Nếu
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    37 có số lượng thẻ thấp, thì việc phân phối các phần chèn có thể giống như sau

    MongoDB thay đổi khóa phân đoạn

    Cụm trong ví dụ này sẽ không chia tỷ lệ theo chiều ngang, vì quá trình ghi đến sẽ chỉ định tuyến đến một tập hợp con các phân đoạn

    Việc chọn một khóa phân đoạn có số lượng thẻ cao không tự nó đảm bảo phân phối dữ liệu đồng đều trên cụm phân đoạn. tần suấttính đơn điệu của khóa phân đoạn cũng góp phần phân phối dữ liệu. Cân nhắc từng yếu tố khi chọn khóa phân đoạn.

    Nếu mô hình dữ liệu của bạn yêu cầu phân đoạn trên khóa có lực lượng thấp, hãy cân nhắc sử dụng chỉ mục tổng hợp bằng cách sử dụng trường có lực lượng tương đối cao hơn

    Tần suất khóa phân mảnh

    Xem xét một tập hợp đại diện cho phạm vi của các giá trị khóa phân đoạn -

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    39 của khóa phân đoạn biểu thị tần suất xuất hiện của một giá trị nhất định trong dữ liệu. Nếu phần lớn các tài liệu chỉ chứa một tập hợp con của các giá trị đó, thì các khối lưu trữ các tài liệu đó sẽ trở thành nút cổ chai trong cụm. Hơn nữa, khi những khối đó phát triển, chúng có thể trở thành những khối không thể chia được vì chúng không thể tách ra được nữa. Điều này làm giảm hoặc loại bỏ hiệu quả của tỷ lệ ngang trong cụm

    Hình ảnh sau đây minh họa một cụm phân đoạn sử dụng trường

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    37 làm khóa phân đoạn. Nếu một tập hợp con các giá trị cho
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    37 xảy ra với tần suất cao, phân phối của các phần chèn có thể giống như sau

    MongoDB thay đổi khóa phân đoạn

    Việc chọn khóa phân đoạn có tần suất thấp tự nó không đảm bảo phân phối dữ liệu đồng đều trên cụm phân đoạn. tính chính xáctính đơn điệu của khóa phân đoạn cũng góp phần phân phối dữ liệu. Cân nhắc từng yếu tố khi chọn khóa phân đoạn.

    Nếu mô hình dữ liệu của bạn yêu cầu phân đoạn trên khóa có giá trị tần suất cao, hãy cân nhắc sử dụng chỉ mục tổng hợp sử dụng giá trị tần số thấp hoặc duy nhất

    Độ đơn điệu của khóa mảnh

    Khóa phân đoạn trên một giá trị tăng hoặc giảm đơn điệu có nhiều khả năng phân phối các phần chèn vào một phân đoạn duy nhất trong cụm

    Điều này xảy ra bởi vì mỗi cụm có một đoạn ghi lại một phạm vi có giới hạn trên của maxKey.

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    42 luôn so sánh cao hơn tất cả các giá trị khác. Tương tự, có một đoạn ghi lại một phạm vi có giới hạn dưới của monKey.
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    43 luôn so sánh thấp hơn tất cả các giá trị khác

    Nếu giá trị khóa phân đoạn luôn tăng, tất cả các phần chèn mới sẽ được định tuyến đến đoạn có

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    42 làm giới hạn trên. Nếu giá trị khóa phân đoạn luôn giảm, tất cả các phần chèn mới sẽ được định tuyến đến đoạn có
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    43 làm giới hạn dưới. Phân đoạn chứa đoạn đó trở thành nút cổ chai cho các thao tác ghi

    Hình ảnh sau đây minh họa một cụm phân đoạn sử dụng trường

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    37 làm khóa phân đoạn. Nếu các giá trị cho
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    37 tăng dần đều, phân phối các phần chèn có thể trông giống như sau

    MongoDB thay đổi khóa phân đoạn

    Nếu giá trị khóa phân đoạn giảm đơn điệu, thì thay vào đó, tất cả các phần chèn sẽ định tuyến đến

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    48

    Việc chọn một khóa phân đoạn không thay đổi đơn điệu, tự nó không đảm bảo phân phối dữ liệu đồng đều trên cụm phân đoạn. số lượngtần suất của khóa phân đoạn cũng góp phần phân phối dữ liệu. Cân nhắc từng yếu tố khi chọn khóa phân đoạn.

    Nếu mô hình dữ liệu của bạn yêu cầu phân đoạn trên một khóa thay đổi đơn điệu, hãy cân nhắc sử dụng Phân đoạn băm

    Thay đổi giá trị khóa phân đoạn của tài liệu

    Ghi chú

    Khi cập nhật giá trị khóa phân đoạn

    • Bạn

      phải chạy trên một
      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      49. Không thực hiện thao tác trực tiếp trên phân đoạn
    • Bạn phải chạy trong giao dịch hoặc dưới dạng ghi có thể thử lại

    • Bạn phải bao gồm một điều kiện bình đẳng trên khóa phân đoạn đầy đủ trong bộ lọc truy vấn. Ví dụ: nếu một thư bộ sưu tập sử dụng

      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      50 làm khóa phân đoạn, thì để cập nhật khóa phân đoạn cho tài liệu, bạn phải đưa
      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      51 vào bộ lọc truy vấn. Bạn có thể bao gồm các trường bổ sung trong truy vấn nếu thích hợp

    Xem thêm lệnh/phương thức ghi cụ thể để biết các yêu cầu bổ sung dành riêng cho hoạt động khi chạy với bộ sưu tập được phân đoạn

    Bắt đầu từ MongoDB 4. 2, bạn có thể cập nhật giá trị khóa phân đoạn của tài liệu trừ khi trường khóa phân đoạn là trường

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    1 bất biến. Để cập nhật, hãy sử dụng các thao tác sau để cập nhật giá trị khóa phân đoạn của tài liệu

    Chỉ huy

    Phương pháp

    cập nhật với

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    53

    db. thu thập. thay thếOne()

    db. thu thập. cập nhậtOne()

    db. thu thập. cập nhật () với

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    53

    findAndModify

    db. thu thập. findOneAndReplace()

    db. thu thập. findOneAndUpdate()

    db. thu thập. findAndModify()

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    55

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    56

    Nếu sửa đổi khóa phân đoạn dẫn đến việc di chuyển tài liệu sang một phân đoạn khác, thì bạn không thể chỉ định nhiều hơn một sửa đổi khóa phân đoạn trong thao tác hàng loạt; . e. kích thước lô 1

    Nếu sửa đổi khóa phân đoạn không dẫn đến việc di chuyển tài liệu sang phân đoạn khác, bạn có thể chỉ định sửa đổi nhiều khóa phân đoạn trong thao tác hàng loạt

    Cảnh báo

    Bắt đầu từ phiên bản 4. 4, tài liệu trong bộ sưu tập phân đoạn có thể thiếu các trường khóa phân đoạn. Thận trọng để tránh vô tình xóa khóa phân đoạn khi thay đổi giá trị khóa phân đoạn của tài liệu

    Thiếu khóa phân mảnh

    Bắt đầu từ phiên bản 4. 4, tài liệu trong bộ sưu tập phân đoạn có thể thiếu các trường khóa phân đoạn

    Phạm vi khối và các trường khóa phân đoạn bị thiếu

    Các khóa phân đoạn bị thiếu nằm trong cùng phạm vi khối với các khóa phân đoạn có giá trị null. Ví dụ: nếu khóa phân đoạn nằm trên các trường

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    57, thì

    Tài liệu bị thiếu Shard Key

    Rơi vào cùng phạm vi với

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    58

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    59

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    60

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    61

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    62

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    63

    Thao tác đọc/ghi và các trường khóa phân đoạn bị thiếu

    Để nhắm mục tiêu các tài liệu có trường khóa phân đoạn bị thiếu, bạn có thể sử dụng điều kiện lọc

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    64 trên các trường khóa phân đoạn. Ví dụ: nếu khóa phân đoạn nằm trên các trường
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    57, để tìm các tài liệu có các trường khóa phân đoạn bị thiếu

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )

    Nếu bạn chỉ định một điều kiện bộ lọc đối sánh đẳng thức null (e. g.

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    66), bộ lọc khớp với cả những tài liệu có trường khóa phân đoạn bị thiếu và những tài liệu có trường khóa phân đoạn được đặt thành
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    0

    Một số thao tác ghi, chẳng hạn như ghi với thông số kỹ thuật của

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    68, yêu cầu khớp đẳng thức trên khóa phân đoạn. Trong những trường hợp đó, để nhắm mục tiêu tài liệu thiếu khóa phân đoạn, hãy bao gồm một điều kiện lọc khác ngoài đối sánh đẳng thức
    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    0. Ví dụ

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    5

    Đặt các trường khóa phân đoạn bị thiếu

    Để đặt các trường khóa phân đoạn bị thiếu (khác với việc thay đổi giá trị của trường khóa phân đoạn hiện có ), bạn có thể sử dụng cách sau .

    Chỉ huy

    Phương pháp

    Sự miêu tả

    cập nhật với

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    71

    db. thu thập. cập nhật() với

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    71

    • Chỉ có thể được sử dụng để đặt giá trị khóa bị thiếu thành

      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      0

    • Có thể được thực hiện bên trong hoặc bên ngoài một giao dịch

    • Có thể được thực hiện dưới dạng ghi có thể thử lại hoặc không

    • Đối với các yêu cầu bổ sung, hãy tham khảo lệnh/phương thức cụ thể

    cập nhật với

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    53

    db. thu thập. thay thếOne()

    db. thu thập. cập nhậtOne()

    db. thu thập. cập nhật() với

    db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
    53

    • Có thể được sử dụng để đặt giá trị khóa bị thiếu thành

      db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
      0 hoặc bất kỳ giá trị nào khác

    • Để đặt thành giá trị không phải ____10, phải được thực hiện bên trong giao dịch hoặc dưới dạng ghi có thể thử lại

      Làm cách nào để cập nhật giá trị khóa trong MongoDB?

      và để cập nhật các giá trị, hãy sử dụng toán tử $set, db. tên bộ sưu tập. cập nhật( { _id. 100 }, { $set. { key1. giá trị1, khóa2. giá trị2,. } } )

      Khóa phân đoạn mặc định trong MongoDB là gì?

      Khóa phân đoạn là một trường được lập chỉ mục duy nhất hoặc nhiều trường được bao phủ bởi một chỉ mục phức hợp xác định phân phối tài liệu của bộ sưu tập giữa các phân đoạn của cụm.

      Khóa shard có phải là duy nhất không?

      Các cột khóa phân đoạn phải càng độc đáo càng tốt

      Làm cách nào để tạo khóa phân đoạn trong MongoDB?

      Bắt đầu từ MongoDB 4. 4, bạn có thể sử dụng lệnh tweakCollectionShardKey để tinh chỉnh khóa phân đoạn của bộ sưu tập . Lệnh tweakCollectionShardKey thêm trường hậu tố hoặc các trường vào khóa hiện có để tạo khóa phân đoạn mới.