Mongodb sử dụng thuật toán sắp xếp nào?

Con trỏ và các phương thức của nó trong MongoDB đã được giải thích chi tiết trong hướng dẫn trước của chúng tôi trong loạt bài Đào tạo về MongoDB này

Show

Trong hướng dẫn này, chúng ta sẽ tìm hiểu sâu về phương thức Sắp xếp trong MongoDB

Phương pháp sắp xếp được sử dụng để ưu tiên các tài liệu hoặc sắp xếp thứ tự của chúng trong bộ sưu tập mongo. Nói một cách đơn giản, phương thức sắp xếp sắp xếp tất cả các tài liệu phù hợp với tiêu chí cụ thể và trả về kết quả

Mongodb sử dụng thuật toán sắp xếp nào?

Như bạn đã biết, một bản ghi được trả về dưới dạng con trỏ và phương pháp sắp xếp được áp dụng trên con trỏ. Vì vậy, khi chúng ta kết hợp phương thức sắp xếp với con trỏ, nó sẽ trả về cho chúng ta các tài liệu theo một thứ tự cụ thể

Phương thức sắp xếp chỉ có một tham số mà chúng ta phải truyền trường và giá trị của chúng. Các tham số được truyền ở Định dạng JSON như {Field. Giá trị} trong dấu ngoặc đơn của phương thức sắp xếp. Chúng tôi cũng có thể chuyển nhiều trường và giá trị để sắp xếp các bản ghi trên chúng

Bạn sẽ học được gì

Sắp xếp tăng dần và giảm dần

Phương pháp này cho phép chúng tôi sắp xếp tài liệu theo thứ tự tăng dần và giảm dần. Nếu chúng ta chuyển “1” làm tham số của trường sắp xếp, thì nó sẽ sắp xếp các tài liệu theo thứ tự tăng dần. Nếu chúng ta chuyển “-1” làm tham số của trường, thì nó sẽ trả về tất cả các bản ghi theo thứ tự giảm dần

cú pháp

db.collection.find().sort({field:order})

Mã số

db.staff.find().sort({staff_id:1})
db.staff.find().sort({staff_id:-1})

Hình 1. Trong vỏ Mongo

Mongodb sử dụng thuật toán sắp xếp nào?

Hình 2. Trong Robo 3T

Mongodb sử dụng thuật toán sắp xếp nào?

Chúng ta cũng có thể sắp xếp nhiều trường cùng một lúc. Bạn có thể quan sát kịch bản này với sự trợ giúp của đoạn mã sau

cú pháp

db.collection.find().sort({field:order, field:order })

Giới hạn sắp xếp

Mongodb lưu trữ tất cả các bản ghi trong bộ nhớ ảo và có một điều kiện được áp dụng trên tập dữ liệu. Điều kiện là các bản ghi phải nhỏ hơn 32 megabyte. Đôi khi việc sắp xếp không được thực hiện do sử dụng nhiều bộ nhớ

Giả sử nếu bạn có một nhóm lớn tài liệu chiếm hơn 32 MB bộ nhớ thì nó sẽ không thực hiện bất kỳ thao tác sắp xếp nào

Thay vào đó, nó sẽ trả về một lỗi trở thành nguyên nhân để loại bỏ truy vấn này. Để tối ưu hóa tình huống này, bạn có thể sử dụng kết hợp giới hạn và sắp xếp cùng nhau hoặc bạn có thể sử dụng lập chỉ mục phù hợp

Giới hạn kết quả sắp xếp

Chúng ta có thể sử dụng phương thức sắp xếp cùng với phương thức giới hạn để có được bản ghi giới hạn và được sắp xếp cùng nhau. Bằng cách này, chúng tôi có thể tối ưu hóa các hoạt động truy vấn trên Mongo DB và cũng tăng tốc độ cùng với mức tiêu thụ bộ nhớ

Chúng tôi cũng có thể sử dụng thuật toán sắp xếp top-k để tối ưu hóa các truy vấn của mình. Trong thuật toán này, bất cứ khi nào bản ghi tiêu tốn bộ nhớ hơn 32 MB, thì truy vấn sẽ tự động bị loại bỏ

Phần kết luận

Phương pháp sắp xếp giúp chúng tôi sắp xếp bản ghi theo một thứ tự cụ thể. Chúng tôi có thể lấy tài liệu theo thứ tự tăng dần và giảm dần. Chúng tôi cũng có thể áp dụng nhiều thứ tự với sự trợ giúp của phương pháp sắp xếp trong các trường khác nhau

Trong trường hợp giá trị chữ cái của trường, việc sắp xếp được áp dụng theo thứ tự chữ cái thông qua “1” và “-1”. Chẳng hạn như một người sẽ sắp xếp tất cả các bản ghi từ A đến Z và một người tiêu cực sẽ sắp xếp các bản ghi từ Z đến A

Sau đây là những khác biệt về chức năng giữa Amazon DocumentDB (có khả năng tương thích với MongoDB) và MongoDB

Lợi ích chức năng của Amazon DocumentDB

Giao dịch ngầm

Trong Amazon DocumentDB, tất cả các câu lệnh CRUD (

db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
2,
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
3,
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
4,
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
5) đảm bảo tính nguyên tử và tính nhất quán, ngay cả đối với các hoạt động sửa đổi nhiều tài liệu. Với sự ra mắt của Amazon DocumentDB 4. 0, các giao dịch rõ ràng cung cấp các thuộc tính ACID cho các hoạt động đa câu lệnh và nhiều bộ sưu tập hiện được hỗ trợ. Để biết thêm về cách sử dụng giao dịch trong Amazon DocumentDB, vui lòng xem Giao dịch

Sau đây là các ví dụ về hoạt động trong Amazon DocumentDB sửa đổi nhiều tài liệu đáp ứng cả hành vi nguyên tử và hành vi nhất quán

db.miles.update(
    { "credit_card": { $eq: true } },
    { $mul: { "flight_miles.$[]": NumberInt(2) } },
    { multi: true }
)
         
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         

Các hoạt động riêng lẻ tạo thành các hoạt động hàng loạt như

db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
6 và
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
7 là nguyên tử nhưng toàn bộ hoạt động hàng loạt không phải là nguyên tử. Ví dụ: toàn bộ hoạt động
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
8 là nguyên tử nếu các hoạt động chèn riêng lẻ thực hiện thành công mà không có lỗi. Nếu gặp lỗi với thao tác
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
8, mỗi câu lệnh chèn riêng lẻ trong thao tác
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
8 sẽ thực thi như một thao tác nguyên tử. Nếu bạn yêu cầu các thuộc tính ACID cho các phép toán
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
8,
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
6 và
db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
7, bạn nên sử dụng một giao dịch

Amazon DocumentDB tiếp tục cải thiện khả năng tương thích với MongoDB bằng cách làm ngược lại các khả năng mà khách hàng yêu cầu chúng tôi xây dựng. Phần này chứa các điểm khác biệt về chức năng mà chúng tôi đã loại bỏ trong Amazon DocumentDB để giúp việc di chuyển và xây dựng ứng dụng dễ dàng hơn cho khách hàng của chúng tôi

Lập chỉ mục mảng

Kể từ ngày 23 tháng 4 năm 2020, Amazon DocumentDB hiện hỗ trợ khả năng lập chỉ mục các mảng lớn hơn 2.048 byte. Giới hạn cho một mục riêng lẻ trong một mảng vẫn là 2.048 byte, phù hợp với MongoDB

Nếu bạn đang tạo một chỉ mục mới, bạn không cần thực hiện hành động nào để tận dụng chức năng được cải thiện. Nếu bạn có một chỉ mục hiện có, bạn có thể tận dụng lợi thế của chức năng được cải thiện bằng cách bỏ chỉ mục rồi tạo lại nó. Phiên bản chỉ mục hiện tại với các khả năng được cải thiện là

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
4

Đối với các cụm sản xuất, việc giảm chỉ mục có thể ảnh hưởng đến hiệu suất ứng dụng của bạn. Chúng tôi khuyên bạn nên kiểm tra trước và tiến hành thận trọng khi thực hiện các thay đổi đối với hệ thống sản xuất. Ngoài ra, thời gian cần thiết để tạo lại chỉ mục sẽ là một chức năng của kích thước dữ liệu tổng thể của bộ sưu tập

Bạn có thể truy vấn phiên bản chỉ mục của mình bằng lệnh sau

db.collection.getIndexes()

Đầu ra từ hoạt động này trông giống như sau. Trong kết quả này, phiên bản của chỉ mục là

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
4, đây là phiên bản chỉ mục mới nhất

[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]

Chỉ mục đa phím

Kể từ ngày 23 tháng 4 năm 2020, Amazon DocumentDB hiện hỗ trợ khả năng tạo chỉ mục phức hợp với nhiều khóa trong cùng một mảng

Nếu bạn đang tạo một chỉ mục mới, bạn không cần thực hiện hành động nào để tận dụng chức năng được cải thiện. Nếu bạn có một chỉ mục hiện có, bạn có thể tận dụng lợi thế của chức năng được cải thiện bằng cách bỏ chỉ mục rồi tạo lại nó. Phiên bản chỉ mục hiện tại với các khả năng được cải thiện là

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
4

Đối với các cụm sản xuất, việc giảm chỉ mục có thể ảnh hưởng đến hiệu suất ứng dụng của bạn. Chúng tôi khuyên bạn nên kiểm tra trước và tiến hành thận trọng khi thực hiện các thay đổi đối với hệ thống sản xuất. Ngoài ra, thời gian cần thiết để tạo lại chỉ mục sẽ là một chức năng của kích thước dữ liệu tổng thể của bộ sưu tập

Bạn có thể truy vấn phiên bản chỉ mục của mình bằng lệnh sau

db.collection.getIndexes()

Đầu ra từ hoạt động này trông giống như sau. Trong kết quả này, phiên bản của chỉ mục là

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
4, đây là phiên bản chỉ mục mới nhất

[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         

Ký tự Null trong Chuỗi

Kể từ ngày 22 tháng 6 năm 2020, Amazon DocumentDB hiện hỗ trợ ký tự null (

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
8 ) trong chuỗi

Kiểm soát truy cập dựa trên vai trò

Kể từ ngày 26 tháng 3 năm 2020, Amazon DocumentDB hỗ trợ kiểm soát truy cập dựa trên vai trò (RBAC) cho các vai trò tích hợp. Để tìm hiểu thêm, hãy xem Kiểm soát truy cập dựa trên vai trò. Amazon DocumentDB chưa hỗ trợ vai trò tùy chỉnh cho RBAC

db.products.deleteMany({ "cost": { $gt: 30.00 } }) 9 Lập chỉ mục

Kể từ ngày 22 tháng 6 năm 2020, Amazon DocumentDB hiện hỗ trợ khả năng cho người vận hành

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
9 sử dụng chỉ mục

Để sử dụng một chỉ mục với toán tử

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
9, bạn phải sử dụng lệnh
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
2. Khi sử dụng
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
2, bạn phải chỉ định tên của trường bạn đang áp dụng
db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
9 trên. Ví dụ: nếu bạn có một chỉ mục trên trường
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
5 với tên chỉ mục là
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
6, thì
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
7 sẽ sử dụng chỉ mục
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
6, nhưng
db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
9 sẽ không sử dụng chỉ mục đó. Bạn có thể xác minh xem một chỉ mục có được chọn hay không bằng cách sử dụng lệnh
db.collection.getIndexes()
0 hoặc sử dụng trình lược tả để ghi lại các truy vấn chậm. Ví dụ,
db.collection.getIndexes()
1

Chỉ có thể sử dụng phương thức

db.runCommand({
  delete: "products",
  deletes: [{ q: { "cost": { $gt: 30.00 } }, limit: 0 }]
})
         
2 với một chỉ mục tại một thời điểm

Việc sử dụng chỉ mục cho truy vấn

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
9 được tối ưu hóa cho các truy vấn biểu thức chính quy sử dụng tiền tố và không chỉ định các tùy chọn biểu thức chính quy
db.collection.getIndexes()
4,
db.collection.getIndexes()
5 hoặc
db.collection.getIndexes()
6

Khi sử dụng chỉ mục có

db.products.deleteMany({
  "cost": { $gt: 30.00 }
})
         
9, bạn nên tạo chỉ mục trên các trường có tính chọn lọc cao, nơi số lượng giá trị trùng lặp nhỏ hơn 1% tổng số tài liệu trong bộ sưu tập. Ví dụ: nếu bộ sưu tập của bạn chứa 100.000 tài liệu, chỉ tạo chỉ mục trên các trường có cùng một giá trị xảy ra 1000 lần hoặc ít hơn

Phép chiếu cho các tài liệu lồng nhau

Có sự khác biệt về chức năng với toán tử

db.collection.getIndexes()
8 giữa Amazon DocumentDB và MongoDB trong phiên bản 3. 6 đã được giải quyết trong Amazon DocumentDB 4. 0 nhưng sẽ vẫn không được hỗ trợ trong Amazon DocumentDB 3. 6

Tài liệu AmazonDB 3. 6 chỉ xem xét trường đầu tiên trong tài liệu lồng nhau khi áp dụng phép chiếu trong khi MongoDB 3. 6 sẽ phân tích các tài liệu con và cũng áp dụng phép chiếu cho từng tài liệu con

Ví dụ. nếu phép chiếu là

db.collection.getIndexes()
9, thì hành vi sẽ hoạt động như mong đợi trong cả Amazon DocumentDB và MongoDB. Tuy nhiên, nếu phép chiếu là
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
0 thì Amazon DocumentDB 3. 6 sẽ chỉ áp dụng dự báo cho
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
1 chứ không áp dụng cho
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
2 hoặc
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
3. Trong Tài liệu AmazonDB 4. 0, phép chiếu
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
0 sẽ được áp dụng cho
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
1,
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
2 và
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
3

Sự khác biệt về chức năng với MongoDB

Cơ sở dữ liệu quản trị và bộ sưu tập

Amazon DocumentDB không hỗ trợ quản trị viên hoặc cơ sở dữ liệu cục bộ cũng như bộ sưu tập MongoDB

[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
8 hoặc
[
    {
        "v" : 3,
        "key" : {
        "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
9 tương ứng

Trong Amazon DocumentDB,

db.collection.getIndexes()
0 đặt lại bộ đếm cho mỗi yêu cầu của
db.collection.getIndexes()
1. Do đó, nếu 3000MS
db.collection.getIndexes()
2 được chỉ định, thì truy vấn mất 2800MS và mỗi yêu cầu
db.collection.getIndexes()
1 tiếp theo mất 300MS, sau đó con trỏ sẽ không hết thời gian chờ. Con trỏ sẽ chỉ hết thời gian chờ khi một thao tác đơn lẻ, truy vấn hoặc một yêu cầu
db.collection.getIndexes()
1 riêng lẻ, chiếm nhiều hơn thời gian
db.collection.getIndexes()
2 đã chỉ định. Hơn nữa, trình quét kiểm tra thời gian thực hiện con trỏ chạy ở mức độ chi tiết nhỏ

giải thích()

Amazon DocumentDB giả lập MongoDB 4. 0 trên một công cụ cơ sở dữ liệu được xây dựng có mục đích sử dụng hệ thống lưu trữ phân tán, chịu lỗi, tự phục hồi. Do đó, kế hoạch truy vấn và đầu ra của

db.collection.getIndexes()
0 có thể khác nhau giữa Amazon DocumentDB và MongoDB. Những khách hàng muốn kiểm soát kế hoạch truy vấn của họ có thể sử dụng toán tử
db.collection.getIndexes()
7 để thực thi lựa chọn chỉ mục ưa thích

Giới hạn tên trường

Amazon DocumentDB không hỗ trợ dấu chấm “. ” trong tên trường tài liệu, ví dụ:

db.collection.getIndexes()
8

Amazon DocumentDB cũng không hỗ trợ tiền tố $ trong tên trường

Ví dụ: hãy thử lệnh sau trong Amazon DocumentDB hoặc MongoDB

rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})

MongoDB sẽ trả về như sau

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
0

Amazon DocumentDB sẽ trả về lỗi

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
1

Có một ngoại lệ cho sự khác biệt chức năng này. Các tên trường bắt đầu bằng tiền tố $ sau đây đã được đưa vào danh sách cho phép và có thể được sử dụng thành công trong Amazon DocumentDB. $id, $ref và $db

Bản dựng chỉ mục

Amazon DocumentDB chỉ cho phép xây dựng một chỉ mục trên một bộ sưu tập tại bất kỳ thời điểm nào. Ở phía trước hoặc phía sau. Nếu các thao tác như

db.collection.getIndexes()
9 hoặc
[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
0 xảy ra trên cùng một bộ sưu tập khi quá trình xây dựng chỉ mục hiện đang được tiến hành, thì thao tác mới thử sẽ không thành công

Theo mặc định, chỉ mục được xây dựng trong Amazon DocumentDB và MongoDB phiên bản 4. 0 xảy ra trong nền. MongoDB phiên bản 4. 2 và sau đó bỏ qua tùy chọn tạo chỉ mục nền nếu được chỉ định để tạoChỉ mục hoặc trình trợ giúp trình bao của nó

db.collection.getIndexes()
9 và
[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
2

Chỉ mục Thời gian tồn tại (TTL) bắt đầu hết hạn tài liệu sau khi quá trình xây dựng chỉ mục hoàn tất

Tra cứu với phím trống trong đường dẫn

Khi bạn tra cứu bằng một khóa bao gồm chuỗi rỗng như một phần của đường dẫn (e. g.

[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
3,
[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
4) và đối tượng có đường dẫn khóa chuỗi trống (e. g.
[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
5) bên trong một mảng, Amazon DocumentDB sẽ trả về các kết quả khác so với khi bạn chạy cùng một tra cứu trong MongoDB

Trong MongoDB, đường dẫn khóa trống tra cứu trong mảng hoạt động như mong đợi khi khóa chuỗi trống không ở cuối đường dẫn tra cứu. Tuy nhiên, khi khóa chuỗi trống ở cuối đường dẫn tra cứu, nó không nhìn vào mảng

Tuy nhiên, trong Amazon DocumentDB, chỉ phần tử đầu tiên trong mảng được đọc, vì

[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
6 chuyển đổi chuỗi rỗng thành
[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
7, do đó, tra cứu khóa chuỗi được coi là tra cứu chỉ mục mảng

MongoDB API, hoạt động và kiểu dữ liệu

Amazon DocumentDB tương thích với MongoDB 3. 6 và 4. 0 API. Để biết danh sách cập nhật các chức năng được hỗ trợ, hãy xem API, Hoạt động và Loại dữ liệu MongoDB được hỗ trợ

[ { "v" : 3, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" } ] 8 và [ { "v" : 3, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.test" } ] 9 Tiện ích

Amazon DocumentDB không hỗ trợ cơ sở dữ liệu quản trị và do đó không kết xuất hoặc khôi phục cơ sở dữ liệu quản trị khi sử dụng các tiện ích

[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
8 hoặc
[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
9. Khi bạn tạo cơ sở dữ liệu mới trong Amazon DocumentDB bằng cách sử dụng
[
    {
        "v" : 3,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.test"
    }
]
         
9, bạn cần tạo lại vai trò người dùng bên cạnh thao tác khôi phục

Thứ tự kết quả

Amazon DocumentDB không đảm bảo thứ tự sắp xếp kết quả ngầm định của tập hợp kết quả. Để đảm bảo thứ tự của tập kết quả, hãy chỉ định rõ ràng thứ tự sắp xếp bằng cách sử dụng

rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
3

Ví dụ sau sắp xếp các mục trong bộ sưu tập hàng tồn kho theo thứ tự giảm dần dựa trên trường chứng khoán

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
2

Khi sử dụng giai đoạn tổng hợp

rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
4, thứ tự sắp xếp không được giữ nguyên trừ khi giai đoạn
rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
4 là giai đoạn cuối cùng trong quy trình tổng hợp. Khi sử dụng giai đoạn tổng hợp
rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
4 kết hợp với giai đoạn tổng hợp
rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
7, giai đoạn tổng hợp
rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
4 chỉ được áp dụng cho bộ tích lũy
rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
9 và
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
00. Trong Tài liệu AmazonDB 4. 0, hỗ trợ đã được thêm vào cho
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
01 để tôn trọng thứ tự sắp xếp từ giai đoạn
rs0:PRIMARY< db.foo.insert({"a":{"$a":1}})
4 trước đó

Ghi có thể thử lại

Bắt đầu với MongoDB 4. 2 trình điều khiển tương thích, tính năng ghi có thể thử lại được bật theo mặc định. Tuy nhiên, Amazon DocumentDB hiện không hỗ trợ ghi có thể thử lại. Sự khác biệt về chức năng sẽ tự biểu hiện trong một thông báo lỗi tương tự như sau

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
3

Ghi có thể thử lại có thể bị vô hiệu hóa thông qua chuỗi kết nối (ví dụ:

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
03 hoặc đối số từ khóa của hàm tạo MongoClient (ví dụ:
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
04

Sau đây là một ví dụ Python tắt tính năng ghi có thể thử lại trong chuỗi kết nối

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
4

Chỉ mục thưa thớt

Để sử dụng chỉ mục thưa thớt mà bạn đã tạo trong truy vấn, bạn phải sử dụng mệnh đề

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
05 trên các trường bao gồm chỉ mục. Nếu bạn bỏ qua
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
05, Amazon DocumentDB không sử dụng chỉ mục thưa thớt

Sau đây là một ví dụ

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
5

Đối với các chỉ mục nhiều khóa, thưa thớt, Amazon DocumentDB không hỗ trợ ràng buộc khóa duy nhất nếu quá trình tra cứu tài liệu dẫn đến một tập hợp các giá trị và chỉ thiếu một tập hợp con của các trường được lập chỉ mục. Ví dụ:

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
07 không được hỗ trợ, với đầu vào là
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
08, vì
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
09 được lưu trữ trong chỉ mục

nén lưu trữ

Amazon DocumentDB hiện không hỗ trợ tính năng nén cho dữ liệu được lưu trữ hoặc chỉ mục. Kích thước dữ liệu cho dữ liệu được lưu trữ và chỉ mục có thể lớn hơn so với khi bạn sử dụng các tùy chọn khác

Sử dụng $elemMatch trong một Biểu thức $all

Amazon DocumentDB hiện không hỗ trợ việc sử dụng toán tử

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
10 trong biểu thức
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
11. Như một giải pháp thay thế, bạn có thể sử dụng toán tử
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
12 với
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
10 như sau

hoạt động ban đầu

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
6

hoạt động cập nhật

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
7

db.miles.updateMany( { "credit_card": { $eq: true } }, { $mul: { "flight_miles.$[]": NumberInt(2) } } ) 14, db.miles.updateMany( { "credit_card": { $eq: true } }, { $mul: { "flight_miles.$[]": NumberInt(2) } } ) 15, db.miles.updateMany( { "credit_card": { $eq: true } }, { $mul: { "flight_miles.$[]": NumberInt(2) } } ) 16, db.miles.updateMany( { "credit_card": { $eq: true } }, { $mul: { "flight_miles.$[]": NumberInt(2) } } ) 17, db.miles.updateMany( { "credit_card": { $eq: true } }, { $mul: { "flight_miles.$[]": NumberInt(2) } } ) 05 và db.miles.updateMany( { "credit_card": { $eq: true } }, { $mul: { "flight_miles.$[]": NumberInt(2) } } ) 10

Amazon DocumentDB hiện không hỗ trợ khả năng sử dụng chỉ mục với các toán tử

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
14,
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
15,
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
16,
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
17,
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
05,
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
25 và
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
10. Do đó, việc sử dụng các toán tử này sẽ dẫn đến việc quét bộ sưu tập. Thực hiện bộ lọc hoặc khớp trước khi sử dụng một trong các toán tử này sẽ giảm lượng dữ liệu cần quét và do đó có thể cải thiện hiệu suất

db.miles.updateMany( { "credit_card": { $eq: true } }, { $mul: { "flight_miles.$[]": NumberInt(2) } } ) 27

Amazon DocumentDB hỗ trợ khả năng thực hiện khớp đẳng thức (ví dụ: nối ngoài bên trái) nhưng không hỗ trợ các truy vấn con không tương quan

Sử dụng một chỉ mục với
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27

Bây giờ bạn có thể sử dụng chỉ mục với toán tử giai đoạn

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27. Dựa trên trường hợp sử dụng của bạn, có nhiều thuật toán lập chỉ mục mà bạn có thể sử dụng để tối ưu hóa hiệu suất. Phần này sẽ giải thích các thuật toán lập chỉ mục khác nhau cho
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27 và giúp bạn chọn thuật toán tốt nhất cho khối lượng công việc của mình

Theo mặc định, Amazon DocumentDB sẽ sử dụng thuật toán băm khi sử dụng

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
31 và hợp nhất sắp xếp khi sử dụng
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
32. Đối với một số trường hợp sử dụng, có thể nên buộc trình tối ưu hóa truy vấn sử dụng một thuật toán khác. Dưới đây là các thuật toán lập chỉ mục khác nhau mà toán tử tổng hợp
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27 có thể sử dụng

  • Vòng lặp lồng nhau. Gói vòng lặp lồng nhau thường có lợi cho khối lượng công việc nếu bộ sưu tập nước ngoài <1 GB và trường trong bộ sưu tập nước ngoài có chỉ mục. Nếu thuật toán vòng lặp lồng nhau đang được sử dụng, kế hoạch giải thích sẽ hiển thị giai đoạn là
    db.miles.updateMany(
        { "credit_card": { $eq: true } }, 
        { $mul: { "flight_miles.$[]": NumberInt(2) } }
    )
             
    34
  • Sắp xếp hợp nhất. Kế hoạch hợp nhất sắp xếp thường có lợi cho khối lượng công việc nếu bộ sưu tập nước ngoài không có chỉ mục trên trường được sử dụng trong tra cứu và tập dữ liệu đang hoạt động không vừa với bộ nhớ. Nếu thuật toán hợp nhất sắp xếp đang được sử dụng, kế hoạch giải thích sẽ hiển thị giai đoạn là
    db.miles.updateMany(
        { "credit_card": { $eq: true } }, 
        { $mul: { "flight_miles.$[]": NumberInt(2) } }
    )
             
    35
  • Băm. Gói băm thường có lợi cho khối lượng công việc nếu bộ sưu tập nước ngoài < 1GB và tập dữ liệu đang hoạt động phù hợp với bộ nhớ. Nếu thuật toán băm đang được sử dụng, kế hoạch giải thích sẽ hiển thị giai đoạn là
    db.miles.updateMany(
        { "credit_card": { $eq: true } }, 
        { $mul: { "flight_miles.$[]": NumberInt(2) } }
    )
             
    36

Bạn có thể xác định thuật toán lập chỉ mục đang được sử dụng cho toán tử

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27 bằng cách sử dụng giải thích về truy vấn. Dưới đây là một ví dụ

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
8

Để thay thế cho việc sử dụng phương pháp

db.collection.getIndexes()
0, bạn có thể sử dụng trình lược tả để xem lại thuật toán đang được sử dụng khi bạn sử dụng toán tử
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27. Để biết thêm thông tin về trình lược tả, vui lòng xem Lập hồ sơ Hoạt động của Amazon DocumentDB

Sử dụng một
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
40

Nếu bạn muốn buộc trình tối ưu hóa truy vấn sử dụng một thuật toán lập chỉ mục khác với

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27, bạn có thể sử dụng một
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
40. Để làm điều đó, hãy sử dụng nhận xét trong các tùy chọn giai đoạn tổng hợp để buộc một kế hoạch khác. Dưới đây là một ví dụ về cú pháp cho bình luận

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
9

Dưới đây là một ví dụ về việc sử dụng

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
40 để buộc trình tối ưu hóa truy vấn sử dụng thuật toán lập chỉ mục
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
44

db.runCommand({
  update: "miles",
  updates: [
    {
      q: { "credit_card": { $eq: true } },
      u: { $mul: { "flight_miles.$[]": NumberInt(2) } },
      multi: true
    }
  ]
})
         
0

Để kiểm tra thuật toán nào là tốt nhất cho khối lượng công việc của bạn, bạn có thể sử dụng tham số

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
45 của phương pháp
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
46 để đo thời gian thực hiện của giai đoạn
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27 trong khi sửa đổi thuật toán lập chỉ mục (i. e. ,
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
44/
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
49/
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
50)

Ví dụ sau đây cho thấy cách sử dụng

db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
45 để đo thời gian thực hiện của giai đoạn
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
27 bằng thuật toán
db.miles.updateMany(
    { "credit_card": { $eq: true } }, 
    { $mul: { "flight_miles.$[]": NumberInt(2) } }
)
         
49

Kiểu sắp xếp nào được MongoDB hỗ trợ?

MongoDB có thể thực hiện các thao tác sắp xếp trên chỉ mục một trường theo thứ tự tăng dần hoặc giảm dần .

Phương pháp sắp xếp trong MongoDB là gì?

MongoDB – phương thức sort() . Bạn phải áp dụng phương pháp này cho con trỏ trước khi truy xuất bất kỳ tài liệu nào từ cơ sở dữ liệu. specifies the order in which the query returns the matching documents from the given collection. You must apply this method to the cursor before retrieving any documents from the database.

Thuật toán sắp xếp nào không được MongoDB hỗ trợ?

Giải thích. MongoDB không hỗ trợ sắp xếp dựa trên đối chiếu và bị giới hạn so sánh theo byte thông qua memcmp.

Thứ tự sắp xếp mặc định trong MongoDB là gì?

theo mặc định, mongo dường như trả về tài liệu theo thứ tự chèn . MongoDB trả về tài liệu theo thứ tự tự nhiên khi không chỉ định thứ tự sắp xếp.