Vì vậy, như bạn lưu ý, mặc định trong mongoose là khi bạn "nhúng" dữ liệu vào một mảng như thế này, bạn sẽ nhận được _id
giá trị cho mỗi mục nhập mảng như một phần của thuộc tính tài liệu con của chính nó. Bạn thực sự có thể sử dụng giá trị này để xác định chỉ mục của mặt hàng mà bạn định cập nhật. Cách MongoDB thực hiện điều này là $
vị trí biến toán tử, giữ vị trí "khớp" trong mảng:
Folder.findOneAndUpdate(
{ "_id": folderId, "permissions._id": permission._id },
{
"$set": {
"permissions.$": permission
}
},
function(err,doc) {
}
);
.findOneAndUpdate()
đó phương thức sẽ trả về tài liệu đã sửa đổi hoặc nếu không, bạn chỉ có thể sử dụng .update()
như một phương pháp nếu bạn không cần tài liệu được trả về. Các phần chính là "khớp" phần tử của mảng để cập nhật và "xác định" khớp với $
vị trí như đã đề cập trước đó.
Tất nhiên, bạn đang sử dụng $set
toán tử để chỉ các phần tử bạn chỉ định thực sự được gửi "qua dây" tới máy chủ. Bạn có thể thực hiện điều này xa hơn với "ký hiệu dấu chấm" và chỉ cần chỉ định các phần tử bạn thực sự muốn cập nhật. Như trong:
Folder.findOneAndUpdate(
{ "_id": folderId, "permissions._id": permission._id },
{
"$set": {
"permissions.$.role": permission.role
}
},
function(err,doc) {
}
);
Vì vậy, đây là tính linh hoạt mà MongoDB cung cấp, nơi bạn có thể được "nhắm mục tiêu" rất nhiều trong cách bạn thực sự cập nhật tài liệu.
Tuy nhiên, điều này làm được là "bỏ qua" bất kỳ logic nào mà bạn có thể đã tích hợp vào lược đồ "mongoose" của mình, chẳng hạn như "xác nhận" hoặc "móc lưu trước" khác. Đó là bởi vì cách "tối ưu" là một "tính năng" của MongoDB và cách nó được thiết kế. Bản thân Mongoose cố gắng trở thành một trình bao bọc "tiện lợi" đối với logic này. Nhưng nếu bạn đã sẵn sàng để tự mình kiểm soát, thì các bản cập nhật có thể được thực hiện theo cách tối ưu nhất.
Vì vậy, nếu có thể, hãy giữ cho dữ liệu của bạn được "nhúng" và không sử dụng các mô hình được tham chiếu. Nó cho phép cập nhật nguyên tử của cả mục "mẹ" và "con" trong các bản cập nhật đơn giản mà bạn không cần phải lo lắng về tính đồng thời. Có lẽ là một trong những lý do bạn nên chọn MongoDB ngay từ đầu.