Giả sử các mặt hàng trong products
của bạn mảng là duy nhất, không có bất kỳ hỗ trợ phía máy chủ dễ dàng nào để duy trì mảng này theo thứ tự được sắp xếp như ở MongoDB 2.4. Tùy chọn tốt nhất của bạn với các mảng lồng nhau sẽ là sắp xếp các mảng trong logic ứng dụng của bạn sao cho phù hợp (tức là khi chèn / cập nhật hoặc khi truy xuất / hiển thị).
Cân nhắc về mô hình hóa dữ liệu
Nếu bạn cần thực hiện nhiều thao tác với các mục nhập mảng lồng nhau, bạn nên cân nhắc làm phẳng mô hình dữ liệu của mình để làm việc dễ dàng hơn. Mục tiêu thiết kế của bạn với MongoDB phải là có một mô hình dữ liệu phù hợp với các trường hợp sử dụng ứng dụng của bạn với sự cân bằng hiệu suất có thể chấp nhận được giữa tính dễ chèn / cập nhật / truy vấn. Bạn chắc chắn không phải lập mô hình mọi thứ trong một bộ sưu tập / truy vấn nếu làm như vậy là không hợp lý và bạn nên chuẩn bị sẵn sàng để không chuẩn hóa (trùng lặp) dữ liệu. Đối với mối quan hệ nhiều-nhiều, chẳng hạn như sản phẩm <=> danh mục, thông thường, nhúng và không chuẩn hóa bất kỳ thực thể nào ít được cập nhật hơn (ví dụ:nhúng danh mục vào sản phẩm).
Các mảng có giới hạn, được sắp xếp cố định (các mục không phải là duy nhất)
Nếu bạn muốn duy trì các mảng theo thứ tự được sắp xếp và các mục không phải là duy nhất, MongoDB 2.4 có tùy chọn để $push
đến một mảng đã sắp xếp nhưng điều này phải được sử dụng trong phép liên hợp với một lát cắt (giới hạn mảng). Nếu bạn $push
các mục nhập giống hệt nhau vào một mảng được sắp xếp, bạn sẽ có các bản sao (vì vậy đây có thể không phải là thứ bạn đang theo đuổi).
Cập nhật mẫu, giả sử trang page
trong ví dụ của bạn là tên bộ sưu tập:
db.page.update(
// Query
{ "_id": "56rgt46rt54h68rt4h6" },
// Update sorted array
// NB: referring by array index position 0, as there isn't a named reference
{ $push : {
"categories.0.products" : {
// List of new elements to push
$each : [
{ "name" : "E", "pos": 3 }
],
// Sort by pos (ascending)
$sort : { "pos" : 1 },
// Maximum number of array elements (required for $sort)
$slice : -100
}
}}
)