Mongodb thêm trường vào phần tử mảng

Để thêm phần tử mảng mới vào tài liệu MongoDB, hãy sử dụng $(projection) cùng với update(). Hãy để chúng tôi tạo một bộ sưu tập với các tài liệu -

>db.demo222.insertOne({"details":[{"StudentName":"Chris","StudentMarks":78},{"StudentName":"David","StudentMarks":89}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e3ee31703d395bdc213472f")
}

Hiển thị tất cả các tài liệu từ một bộ sưu tập với sự trợ giúp của phương thức find() -

> db.demo222.find().pretty();

Điều này sẽ tạo ra đầu ra sau -

{
   "_id" : ObjectId("5e3ee31703d395bdc213472f"),
   "details" : [
      {
         "StudentName" : "Chris",
         "StudentMarks" : 78
      },
      {
         "StudentName" : "David",
         "StudentMarks" : 89
      }
   ]
}

Sau đây là truy vấn để thêm phần tử mảng mới vào tài liệu -

> db.demo222.update({"details.StudentName" : "Chris"},{"$set" : {"details.$.SubjectName":"MongoDB"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Hiển thị tất cả các tài liệu từ một bộ sưu tập với sự trợ giúp của phương thức find() -

> db.demo222.find().pretty();

Điều này sẽ tạo ra đầu ra sau -

{
   "_id" : ObjectId("5e3ee31703d395bdc213472f"),
   "details" : [
      {
         "StudentName" : "Chris",
         "StudentMarks" : 78,
         "SubjectName" : "MongoDB"
      },
      {
         "StudentName" : "David",
         "StudentMarks" : 89
      }
   ]
}

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

  • Giới thiệu
  • Cập nhật các yếu tố
    • Cập nhật tất cả các yếu tố với $[]
    • Cập nhật phần tử đầu tiên với $
    • Updating elements that match a filter with $[]
  • Hãy tự mình thử
  • Tài nguyên
  • Tìm kiếm thông tin phản hồi của bạn. 💬
Giới thiệu

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ử

> db.demo222.find().pretty();
0 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ảng

Ví 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

Mongodb thêm trường vào phần tử mảng

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à xóa 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 
    }  
});
0.

> db.demo222.find().pretty();
2

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

db.donutCombos.updateMany({ active: true }, {  
    $set: {  
        'donuts.$[].glazing': false 
    }  
});
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 
    }  
});
5

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 
    }  
});
7

Bằng cách kết hợp toán tử vị trí

db.donutCombos.updateMany({ active: true }, {  
    $set: {  
        'donuts.$[].glazing': false 
    }  
});
6 với
> db.demo222.find().pretty();
0, chúng tôi 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 tôi

Trong 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"

{
   "_id" : ObjectId("5e3ee31703d395bdc213472f"),
   "details" : [
      {
         "StudentName" : "Chris",
         "StudentMarks" : 78
      },
      {
         "StudentName" : "David",
         "StudentMarks" : 89
      }
   ]
}
1

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Mongodb thêm trường vào phần tử mảng

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 ta

Vì 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

{
   "_id" : ObjectId("5e3ee31703d395bdc213472f"),
   "details" : [
      {
         "StudentName" : "Chris",
         "StudentMarks" : 78
      },
      {
         "StudentName" : "David",
         "StudentMarks" : 89
      }
   ]
}
5

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Mongodb thêm trường vào phần tử mảng

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.demo222.find().pretty();
26 trong đó
> db.demo222.find().pretty();
27 là trình giữ chỗ cho một giá trị đại diện cho một phần tử của mảng

Sau đó, chúng ta phải sử dụng tham số thứ ba (tùy chọn) của phương thức

> db.demo222.find().pretty();
28 để chỉ định một bộ
> db.demo222.find().pretty();
29. Ở đâ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ật

Trong 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.demo222.update({"details.StudentName" : "Chris"},{"$set" : {"details.$.SubjectName":"MongoDB"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
0

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Mongodb thêm trường vào phần tử mảng

Kết hợp toán tử vị trí đã lọc

> db.demo222.find().pretty();
26 (hoặc trong ví dụ của chúng tôi là
{
   "_id" : ObjectId("5e3ee31703d395bdc213472f"),
   "details" : [
      {
         "StudentName" : "Chris",
         "StudentMarks" : 78
      },
      {
         "StudentName" : "David",
         "StudentMarks" : 89
      }
   ]
}
11) với toán tử
db.donutCombos.updateMany({ active: true }, {  
    $set: {  
        'donuts.$[].glazing': false 
    }  
});
2, chúng tôi 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í
{
   "_id" : ObjectId("5e3ee31703d395bdc213472f"),
   "details" : [
      {
         "StudentName" : "Chris",
         "StudentMarks" : 78
      },
      {
         "StudentName" : "David",
         "StudentMarks" : 89
      }
   ]
}
13 của chúng tôi

Ví 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.demo222.update({"details.StudentName" : "Chris"},{"$set" : {"details.$.SubjectName":"MongoDB"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
5

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Hãy tự mình thử

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

Mongodb thêm trường vào phần tử mảng

Bạn có thể tìm thấy các ví dụ tôi đưa vào bài viết này trong thư mục

{
   "_id" : ObjectId("5e3ee31703d395bdc213472f"),
   "details" : [
      {
         "StudentName" : "Chris",
         "StudentMarks" : 78
      },
      {
         "StudentName" : "David",
         "StudentMarks" : 89
      }
   ]
}
14

pawap90 / 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

thử-mongodb-truy vấn

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

Mongodb thêm trường vào phần tử mảng

phụ thuộc

Những gì bạn cần để chạy dự án này

  • Nút. js

(MongoDB không bắt buộc vì nó sẽ chạy trong bộ nhớ, được xử lý bởi gói

{
   "_id" : ObjectId("5e3ee31703d395bdc213472f"),
   "details" : [
      {
         "StudentName" : "Chris",
         "StudentMarks" : 78
      },
      {
         "StudentName" : "David",
         "StudentMarks" : 89
      }
   ]
}
15)

dùng thử

1. Cài đặt phụ thuộc

> db.demo222.update({"details.StudentName" : "Chris"},{"$set" : {"details.$.SubjectName":"MongoDB"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
8

2. Chạy thử nghiệm

> db.demo222.update({"details.StudentName" : "Chris"},{"$set" : {"details.$.SubjectName":"MongoDB"}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
9

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)

Bài đăng này có hữu ích không?

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?

Làm cách nào để thêm phần tử vào mảng trong MongoDB?

Nếu giá trị là một mảng, $push sẽ nối toàn bộ mảng dưới dạng một phần tử . Để thêm riêng từng phần tử của giá trị, hãy sử dụng công cụ sửa đổi $each với $push. Để biết ví dụ, hãy xem Nối giá trị vào mảng trong nhiều tài liệu. Để biết danh sách các công cụ sửa đổi có sẵn cho $push , hãy xem Công cụ sửa đổi.

Làm cách nào để cập nhật mảng đối tượng trong MongoDB?

Cập nhật tài liệu trong một mảng . Sử dụng toán tử $ vị trí để truy cập các trường trong tài liệu được nhúng bằng ký hiệu dấu chấm trên toán tử $. The positional $ operator facilitates updates to arrays that contain embedded documents. Use the positional $ operator to access the fields in the embedded documents with the dot notation on the $ operator.

Làm cách nào để đẩy nhiều giá trị trong mảng trong MongoDB?

Nếu giá trị là một mảng, $push sẽ thêm toàn bộ mảng dưới dạng một phần tử. Để thêm riêng từng phần tử của giá trị, hãy sử dụng công cụ sửa đổi $each với $push. Để biết ví dụ, hãy xem Nối giá trị vào mảng trong nhiều tài liệu. Để biết danh sách các công cụ sửa đổi có sẵn cho $push , hãy xem Công cụ sửa đổi

Làm cách nào để cập nhật phần tử mảng lồng nhau trong MongoDB?

Cập nhật các mảng lồng nhau cùng với $[] . Phần sau đây cập nhật các giá trị lớn hơn hoặc bằng 8 trong các lớp lồng nhau. The $[] filtered positional operator, in conjunction with the $[] all positional operator, can be used to update nested arrays. The following updates the values that are greater than or equal to 8 in the nested grades.