Hướng dẫn mongodb update array element by index - mongodb cập nhật phần tử mảng theo chỉ mục
Tôi đang cố gắng cập nhật một Subelement duy nhất có trong một mảng trong tài liệu MongoDB. Tôi muốn tham chiếu trường bằng chỉ mục mảng của nó (các phần tử trong mảng không có bất kỳ trường nào mà tôi có thể đảm bảo sẽ là số nhận dạng duy nhất). Có vẻ như điều này sẽ dễ dàng thực hiện, nhưng tôi không thể tìm ra cú pháp. Show
Đây là những gì tôi muốn làm trong Pseudo-Json. Before:
After:
Có vẻ như truy vấn phải là một cái gì đó như thế này:
Nhưng điều này không hoạt động. Tôi đã dành quá lâu để tìm kiếm các tài liệu MongoDB và thử các biến thể khác nhau trên cú pháp này (ví dụ: sử dụng 8, v.v.). Tôi không thể tìm thấy bất kỳ lời giải thích rõ ràng nào về cách thực hiện loại cập nhật này trong MongoDB. Tài liệu về nhà → Hướng dẫn sử dụng MongoDB → MongoDB Manual 9 Toán tử 9 định vị xác định một phần tử trong một mảng để cập nhật mà không chỉ định rõ ràng vị trí của phần tử trong mảng.The
positional Ghi chúĐịnh hướng
Toán tử 9 vị trí có biểu mẫu: 9 operator has the form:Khi được sử dụng với các hoạt động cập nhật, ví dụ: 5 và 6
Ví dụ:
Bắt đầu từ MongoDB 5.0, cập nhật các nhà khai thác xử lý các trường tài liệu với tên dựa trên chuỗi theo thứ tự từ vựng. Các trường có tên số được xử lý theo thứ tự số. Xem Cập nhật hành vi của các nhà khai thác để biết chi tiết. Không sử dụng toán tử vị trí 9 với các hoạt động UPSERT vì chèn sẽ sử dụng 9 làm tên trường trong tài liệu được chèn. 9 with upsert operations
because inserts will use the 9 as a field name in the inserted document.Toán tử 9 vị trí không thể được sử dụng cho các truy vấn vượt qua nhiều hơn một mảng, chẳng hạn như các truy vấn di chuyển mảng được lồng trong các mảng khác, vì sự thay thế cho trình giữ chỗ 9 là một giá trị duy nhất 9 operator cannot be used for queries which traverse more than one array, such as queries that traverse arrays nested within other arrays, because the replacement for the
9 placeholder is a single valueKhi được sử dụng với toán tử 5, toán tử 9 vị trí không loại bỏ phần tử phù hợp khỏi mảng mà thay vào đó đặt nó thành 7. 9 operator does not remove the matching element from the array but rather sets it to 7.Nếu truy vấn khớp với mảng bằng toán tử phủ định, chẳng hạn như 8, 9 hoặc 0, thì bạn không thể sử dụng toán tử vị trí để cập nhật các giá trị từ mảng này.Tuy nhiên, nếu phần phủ định của truy vấn nằm trong biểu thức 1, thì bạn có thể sử dụng toán tử vị trí để cập nhật trường này.Toán tử cập nhật 9 vị trí hành xử mơ hồ khi lọc trên nhiều trường mảng. 9 update operator behaves ambiguously when filtering on multiple array fields.Khi máy chủ thực thi một phương thức cập nhật, trước tiên nó sẽ chạy một truy vấn để xác định tài liệu bạn muốn cập nhật. Nếu bản cập nhật các tài liệu lọc trên nhiều trường mảng, cuộc gọi tiếp theo đến toán tử cập nhật 9 không phải lúc nào cũng cập nhật vị trí cần thiết trong mảng. 9 update operator doesn't always update the required position in the array.Để biết thêm thông tin, xem ví dụ.example. Tạo một bộ sưu tập 4 với các tài liệu sau:
Để cập nhật phần tử đầu tiên có giá trị là 5 lên 6 trong mảng 7, hãy sử dụng toán tử 9 vị trí nếu bạn không biết vị trí của phần tử trong mảng: 9 operator if you do not know the position of the element in the array:Quan trọngBạn phải bao gồm trường mảng như một phần của tài liệu 9.
Toán tử 9 vị trí hoạt động như một trình giữ chỗ cho trận đấu đầu tiên của tài liệu truy vấn cập nhật. 9 operator acts as a placeholder for the first match of the update query document.Sau khi hoạt động, bộ sưu tập 4 chứa các tài liệu sau:
Toán tử 9 vị trí tạo điều kiện cập nhật cho các mảng có chứa các tài liệu nhúng. Sử dụng toán tử 9 vị trí để truy cập các trường trong các tài liệu nhúng với ký hiệu dấu chấm trên toán tử 9. 9 operator facilitates updates to arrays that contain embedded documents. Use the positional 9 operator to access the fields in the embedded documents with the
dot notation on the 9 operator.
Hãy xem xét tài liệu sau trong bộ sưu tập 4 có giá trị phần tử 7 là một mảng các tài liệu nhúng:
Sử dụng toán tử 9 vị trí để cập nhật trường 8 của phần tử mảng đầu tiên phù hợp với 9 bằng với điều kiện 0: 9 operator to update the 8 field of the first array element that matches the 9 equal to 0 condition:Quan trọngBạn phải bao gồm trường mảng như một phần của tài liệu 9.
Toán tử 9 vị trí hoạt động như một trình giữ chỗ cho trận đấu đầu tiên của tài liệu truy vấn cập nhật.
0Sau khi hoạt động, bộ sưu tập 4 chứa các tài liệu sau: 9 operator can update the first array element that matches multiple query criteria specified with the 1 operator.Toán tử 9 vị trí tạo điều kiện cập nhật cho các mảng có chứa các tài liệu nhúng. Sử dụng toán tử 9 vị trí để truy cập các trường trong các tài liệu nhúng với ký hiệu dấu chấm trên toán tử 9. 1Hãy xem xét tài liệu sau trong bộ sưu tập 4 có giá trị phần tử 7 là một mảng các tài liệu nhúng: 9 operator updates the value of the 8 field in the first embedded document that has 9 field with a value less than or equal to 9 and a 0 field with a value greater than 5: 2Sử dụng toán tử 9 vị trí để cập nhật trường 8 của phần tử mảng đầu tiên phù hợp với 9 bằng với điều kiện 0: 3Sau khi hoạt động, tài liệu có các giá trị được cập nhật sau: Toán tử 9 có thể cập nhật phần tử mảng đầu tiên phù hợp với nhiều tiêu chí truy vấn được chỉ định với toán tử 1. 4Hãy xem xét tài liệu sau trong bộ sưu tập 4 có giá trị trường 7 là một mảng các tài liệu nhúng: 5Trong ví dụ dưới đây, toán tử 9 cập nhật giá trị của trường 8 trong tài liệu nhúng đầu tiên có trường 9 có giá trị nhỏ hơn hoặc bằng 9 và trường 0 có giá trị lớn hơn 5: 9 update operator to determine which position in the array to update: 6Hoạt động này cập nhật tài liệu nhúng đầu tiên phù hợp với các tiêu chí, cụ thể là tài liệu nhúng thứ hai trong mảng: 7Nhà điều hành cập nhật 9 vị trí hành xử mơ hồ khi truy vấn có nhiều trường mảng để lọc các tài liệu trong bộ sưu tập. 9 update operator instead changed the 2020 value to 2022.Hãy xem xét một tài liệu trong bộ sưu tập 3, chứa các mảng thông tin sinh viên:
Trong ví dụ sau, người dùng cố gắng sửa đổi trường db.collection.updateOne( { |