điểm. 1
câu trả lời được chấp nhận
Bạn có cú pháp javascript không hợp lệ ở đây. schedules.update[{"id": req.params.id}, { "$set":{ "seats." + req.params.seat+: "1"}}
Không thể nối chuỗi trong định nghĩa đối tượng
Hãy thử như thế này, sử dụng ký hiệu tham chiếu thuộc tính [sẽ tạo thuộc tính]
let updateObj = { $set: {} }
updateObject.$set['seats.' + req.params.seat] = '1'
schedules.update[{"id": req.params.id}, updateObj, function .. ]
Thêm câu hỏi với thẻ tương tự
Trong MongoDB, toán tử $push được sử dụng để nối một giá trị đã chỉ định vào một mảng. Nếu trường được đề cập không có trong tài liệu để cập nhật, toán tử $push sẽ thêm trường đó dưới dạng trường mới và bao gồm giá trị được đề cập làm thành phần của nó. Nếu trường cập nhật không phải là trường kiểu mảng thì thao tác không thành công
Tại thời điểm cập nhật nếu bản thân giá trị là một mảng, toán tử $push sẽ nối toàn bộ mảng dưới dạng một phần tử
Nếu bạn muốn thêm từng phần tử của giá trị một cách riêng biệt, toán tử $push có thể được sử dụng với công cụ sửa đổi $each
cú pháp
db.collection.update[ ,{ $push: { : } }]
Thông số
TênMô tảtrường tên của cột hoặc trường vào tài liệu. giá trị. Đây là những giá trị được chỉ định cho các trường hoặc cột. truy vấn Truy vấn có thể là một biểu thức hoặc điều kiện hoặc tiêu chí
Bộ sưu tập mẫu "sinh viên"
{
"_id" : 1,
"sem" : 1,
"subjects" : [
"phys",
"chem",
"maths",
"gkn",
"stat",
"astro"
],
"achieve" : [
70,
87,
90,
90,
65,
81
]
}
Ví dụ về toán tử MongoDB $push
Nếu chúng ta muốn nối 95 vào trường mảng đạt được đối với các đối tượng điều kiện là "gkn", có thể sử dụng lệnh mongodb sau -
> db.student.update[ { "subjects" : "gkn" },{ $push: { "achieve": 95 } }];
Ở đây trong ví dụ trên, công cụ sửa đổi $each đã được sử dụng để nối nhiều phần tử 77,49,83 vào mảng đạt được khớp với điều kiện đối tượng bằng "gkn"
Chào mừng bạn đến với bài đăng thứ hai trong loạt bài "MongoDB Animated 🍩" của tôi, nơi tôi cung cấp các ví dụ hoạt hình và giải thích cho các hoạt động của MongoDB mà tôi không bao giờ muốn tìm kiếm trên Google nữa
Trong bài đăng này, chúng tôi sẽ xem xét các chiến lược khác nhau để cập nhật các phần tử từ các mảng được nhúng
Tôi sẽ sử dụng bộ sưu tập ví dụ tương tự được sử dụng trong phần trước của loạt bài này. Nó bao gồm một bộ sưu tập đơn giản các "combo bánh rán" từ một cửa hàng bánh rán. Mỗi combo đều có tên và các loại bánh sẽ được tặng kèm nếu khách chọn combo đó. Đây là lược đồ hoàn chỉnh
// donutCombo Schema
{
name: { type: String, required: true },
active: { type: Boolean, required: true },
donuts: [{
color: { type: String },
glazing: { type: Boolean }
}]
}
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Cập nhật các yếu tốCập nhật tất cả các yếu tố với $[]
Sử dụng toán tử $set
kết hợp với toán tử tất cả vị trí
db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
0 cho phép chúng tôi cập nhật tất cả các phần tử mảngVí dụ: giả sử chúng tôi muốn loại bỏ kính khỏi tất cả các bánh rán trong tất cả các tài liệu đang hoạt động
db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Loại hoạt động này có thể hữu ích khi bạn di chuyển sang một lược đồ mới và tài liệu của bạn có các mảng được nhúng. Ví dụ: nếu bạn cần thêm một thuộc tính mới với giá trị mặc định cho tất cả các phần tử mảng
Một cách khác để loại bỏ lớp kính có thể là loại bỏ thuộc tính
db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
1 khỏi tất cả các bánh rán trong tất cả các tài liệu đang hoạt độngĐiều này có thể được thực hiện bằng cách sử dụng toán tử
db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
2 kết hợp với toán tử tất cả vị trí db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
0db.donutCombos.updateMany[{ active: true }, {
$unset: {
'donuts.$[].glazing': 1
}
}];
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Lưu ý rằng, bên trong đối tượng
2, chúng ta phải xác định khóa [thuộc tính mà chúng ta muốn xóa] và giá trị, điều này không ảnh hưởng đến hoạt động. Trong trường hợp này, chúng tôi đã sử dụng "1", nhưng bạn cũng có thể sử dụng một chuỗi rỗng chẳng hạn.db.donutCombos.updateMany[{ active: true }, { $set: { 'donuts.$[].glazing': false } }];
5db.donutCombos.updateMany[{ active: true }, { $set: { 'donuts.$[].glazing': false } }];
Cập nhật phần tử đầu tiên với $
Bạn có thể chỉ cần cập nhật phần tử đầu tiên của mảng. Trong trường hợp đó, bạn nên sử dụng toán tử vị trí
db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
6. Toán tử vị trí này sẽ cho phép chúng ta áp dụng các thay đổi cho phần tử đầu tiên khớp với db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
7 [tham số đầu tiên của phương thức db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
8]. Trường mảng phải là một phần của db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
7Bằng cách kết hợp toán tử vị trí
db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
6 với $set
, chúng ta có thể cập nhật các thuộc tính từ phần tử mảng đầu tiên khớp với db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
7 của chúng taTrong ví dụ sau, chúng tôi sẽ cập nhật chiếc bánh rán màu trắng đầu tiên trong mọi tài liệu và thay đổi màu của nó thành "hồng"
db.donutCombos.updateMany[{ 'donuts.color': 'white' }, {
$set: {
'donuts.$.color': 'pink'
}
}];
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Toán tử vị trí
db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
6 cũng có thể được kết hợp với db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
2 để xóa một thuộc tính khỏi phần tử mảng đầu tiên khớp với db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
7 của chúng taVì vậy, để thử điều đó, hãy xóa màu khỏi chiếc bánh rán màu trắng đầu tiên được tìm thấy trên mỗi tài liệu
db.donutCombos.updateMany[{ 'donuts.color': 'white' }, {
$unset: {
'donuts.$.color': 1
}
}];
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Updating elements that match a filter with $[]
Để cập nhật một tập hợp các phần tử phù hợp với các bộ lọc nhất định, chúng ta phải sử dụng toán tử vị trí được lọc
db.donutCombos.updateMany[{ active: true }, {
$unset: {
'donuts.$[].glazing': 1
}
}];
6 trong đó db.donutCombos.updateMany[{ active: true }, {
$unset: {
'donuts.$[].glazing': 1
}
}];
7 là trình giữ chỗ cho một giá trị đại diện cho một phần tử của mảngSau đó, chúng ta phải sử dụng tham số thứ ba [tùy chọn] của phương thức
db.donutCombos.updateMany[{ active: true }, {
$unset: {
'donuts.$[].glazing': 1
}
}];
8 để chỉ định một bộ db.donutCombos.updateMany[{ active: true }, {
$unset: {
'donuts.$[].glazing': 1
}
}];
9. Ở đây chúng tôi sẽ xác định các điều kiện mà mỗi phần tử mảng chúng tôi muốn cập nhật phải đáp ứng để được cập nhậtTrong ví dụ tiếp theo, chúng tôi sẽ thay đổi mọi màu bánh rán trắng thành xanh lục, chỉ trong các tài liệu đang hoạt động
db.donutCombos.updateMany[{ active: true }, {
$set: {
"donuts.$[donut].color": "green"
}
},
{
arrayFilters: [{ "donut.color": "white" }]
}];
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Kết hợp toán tử vị trí đã lọc
db.donutCombos.updateMany[{ active: true }, {
$unset: {
'donuts.$[].glazing': 1
}
}];
6 [hoặc trong ví dụ của chúng ta là db.donutCombos.updateMany[{ 'donuts.color': 'white' }, {
$set: {
'donuts.$.color': 'pink'
}
}];
1] với toán tử db.donutCombos.updateMany[{ active: true }, {
$set: {
'donuts.$[].glazing': false
}
}];
2, chúng ta có thể xóa một thuộc tính khỏi tất cả các phần tử trong mảng phù hợp với tiêu chí db.donutCombos.updateMany[{ 'donuts.color': 'white' }, {
$set: {
'donuts.$.color': 'pink'
}
}];
3 của chúng taVí dụ: chúng tôi có thể xóa màu của mọi chiếc bánh rán màu trắng trong mọi tài liệu đang hoạt động
db.donutCombos.updateMany[{ active: true }, {
$unset: {
"donuts.$[donut].color": 1
}
},
{
arrayFilters: [{ "donut.color": "white" }]
}];
Vào chế độ toàn màn hình Thoát chế độ toàn màn hình
Tôi đã tạo một repo để thử các truy vấn MongoDB trong bộ nhớ bằng Node. js với trình điều khiển Jest và MongoDB Node. Tôi đã sử dụng các thử nghiệm để thực hiện truy vấn và xác minh rằng mọi thứ đã được cập nhật chính xác. Tôi cũng bao gồm một trình ghi nhật ký in các tài liệu đã cập nhật trong bảng điều khiển hiển thị các thay đổi đã được áp dụng bằng cú pháp tô sáng khác
Bạn có thể tìm thấy các ví dụ mà tôi đưa vào bài viết này trong thư mục
db.donutCombos.updateMany[{ 'donuts.color': 'white' }, {
$set: {
'donuts.$.color': 'pink'
}
}];
4pawap90 / try-mongodb-query
Một dự án mẫu đơn giản để thử các truy vấn MongoDB trong bộ nhớ bằng cách sử dụng Jest
Một dự án đơn giản để thử các truy vấn MongoDB trong bộ nhớ bằng cách sử dụng Jest. Bao gồm một trình ghi nhật ký ghi lại sự khác biệt giữa dữ liệu thử nghiệm ban đầu và dữ liệu sau khi cập nhật bằng cách sử dụng tô sáng cú pháp khác Những gì bạn cần để chạy dự án này [MongoDB không bắt buộc vì nó sẽ chạy trong bộ nhớ, được xử lý bởi gói
5]db.donutCombos.updateMany[{ 'donuts.color': 'white' }, {
$set: {
'donuts.$.color': 'pink'
}
}];
1. Cài đặt phụ thuộc
npm install
2. Chạy thử nghiệm
npm test
Công cụCác công cụ chính được sử dụng trong dự án này
- Trình điều khiển nút MongoDB
- nói đùa
- gói mongodb-memory-server của @nodkz
Xem trên GitHub
Tài nguyênĐể biết thêm thông tin về cách cập nhật mảng, đây là một số tài nguyên từ tài liệu chính thức của MongoDB
Toán tử cập nhật mảng [tài liệu. mongodb. com]
Cập nhật mảng trong tài liệu [docs. mongodb. com]
Tôi quan tâm đến phản hồi của bạn. Bài đăng này có hữu ích không?