Tôi có một tập dữ liệu như thế này:
{
name : 'Doc Name',
photos: [
{
name: 'photo1',
url: '//.....'
},
{
name: 'photo2',
url: '//......'
}
],
etc ...
Sử dụng monk //github.com/learnboost/monk Làm cách nào để cập nhật photo2? Tôi có thể sử dụng một chỉ mục khi tôi đang lặp lại trên các trường vào lúc này.
Nỗ lực hiện tại của tôi dưới đây cho tôi một lỗi và tôi không thể sử dụng một biến cho bộ chọn JSON [như trong chỉ mục].
collection.update[{_id: data._id}, {photos[i].data: filename}, function[err, updatedata] {
}];
Neil Lunn
Phù bằng vàng 144K3535 gold badges322 silver badges307 bronze badges
Đã hỏi ngày 3 tháng 2 năm 2014 lúc 1:16Feb 3, 2014 at 1:16
Cập nhật các mục tại một vị trí trong một mảng có thể được thực hiện bằng cách sử dụng toán tử $ định vị
collection.update[
{ _id: data.id, "photos.name": "photo2" },
{ $set: { "photos.$.data": "yourdata" } }
]
Đã trả lời ngày 3 tháng 2 năm 2014 lúc 2:06Feb 3, 2014 at 2:06
Neil Lunnneil LunnNeil Lunn
Phù bằng vàng 144K3535 gold badges322 silver badges307 bronze badges
2
Đã hỏi ngày 3 tháng 2 năm 2014 lúc 1:16
Cập nhật các mục tại một vị trí trong một mảng có thể được thực hiện bằng cách sử dụng toán tử $ định vị
collection.find[{id: 1}, function[err, doc]{
for[i=0; i< doc.array.length; i++] {
//do what you gotta do
doc.array[i].property = 'new value';
}
collection.update[{id: 1}, {$set : {"doc.array": doc.array}}, function[err,doc]{
console.log[err];
}
}]
Đã trả lời ngày 3 tháng 2 năm 2014 lúc 2:06Feb 3, 2014 at 2:11
Neil Lunnneil LunnRyan Knell
Vì vậy, tôi đã tìm thấy một giải pháp cho vấn đề của mình nhưng có thể có một số lựa chọn tốt hơn và tôi sẽ không trả lời nó. Nhưng đối với bất kỳ ai khác có cùng một vấn đề, đây là những gì tôi đã làm:2 gold badges37 silver badges31 bronze badges
Làm việc với các mảng có thể phức tạp. Cập nhật có thể phức tạp hơn. Người ta nên làm việc cẩn thận trong khi thực hiện các hoạt động cập nhật trên các mảng. Mongoose cung cấp một vài nhà khai thác để cập nhật các mảng như $ addtoset, $ push, $ pop, v.v. Trong bài viết này, chúng tôi sẽ thảo luận về cách sử dụng các nhà khai thác đó để thực hiện các hoạt động cập nhật trên các mảng trong nodejs.Giới thiệu
Đầu tiên chúng tôi muốn sử dụng một bộ dữ liệu để demo với. Chúng tôi sẽ sử dụng bộ sưu tập chi tiết được hiển thị ở đây:
123 | {"_id": ObjectID ["5E158429A7B6505CD15E8097"], "Tên": "John", "Age": 21, "Vị trí": ["New York", "Chicago"] "]," Tên ":" SAM "," Tuổi ": 24," Vị trí ": [" New York "]} {" _ id ": ObjectID [" 5E158453A7B6505CD15E8099 "]," Tên ":" Lisa "," Tuổi ": 27," địa điểm ": [" Washington DC "," Texas "]} "_id" : ObjectId["5e158429a7b6505cd15e8097"], "name" : "John", "age" : 21, "locations" : [ "New York", "Chicago" ] } |
Chúng tôi sẽ sử dụng công cụ Postman để thực hiện kiểm tra điểm cuối. Bạn có thể tải xuống công cụ Postman từ www.getpostman.com.
Vì chúng tôi sẽ thực hiện một hoạt động cập nhật, chúng tôi phải đưa ra yêu cầu đặt. Trình xử lý tuyến sau sẽ được gọi khi điểm cuối ‘/cập nhật được thực thi.
Lưu ý Chúng tôi đã tạo các tuyến đường của chúng tôi bằng cách sử dụng một gói tuyệt vời cho NodeJ có tên là Express. We created our routes using a great package for NodeJS called express.
1 | router.route ["/update"]. đặt [hàm [req, res] {}];route["/update"].put[function[req, res] {}]; |
Hãy để thảo luận về cách cập nhật mảng bằng các toán tử Mongoose trong NodeJS.
$addToSet
Toán tử $ addtoset thêm các giá trị trong một mảng nếu chúng chưa có trong đó. Chúng tôi chỉ định một mảng các giá trị và nó chỉ chèn những giá trị không có trong đó. Hãy để thêm một vài giá trị vào mảng vị trí trong đó tên là John John.
12345678910111213 | router.route ["/update"]. đặt [function [req, res] {& nbsp; chi tiết.updateone [& nbsp; & nbsp; {name: "john"}, & nbsp; New York "," Texas "," Detroit "]}}, & nbsp; & nbsp; function [err, result] {& nbsp; & nbsp; & nbsp; if [err] ]; & nbsp; & nbsp; & nbsp;route["/update"].put[function[req, res] { |
Đến bây giờ, tài liệu trong đó giá trị của trường tên là John John có hai giá trị trong các địa điểm - New York và Chicago. Trong hoạt động cập nhật, chúng tôi sẽ thêm ba giá trị mới vào nó bằng cách sử dụng nhà điều hành $ Addtoset - New York, Texas và Detroit. Một trong ba người này đã có mặt trong mảng vị trí. Hãy để thực hiện nó và xem những gì xảy ra.
Nó trả về một đối tượng. Ở đây, giá trị của nmodified là 1. Điều này có nghĩa là, một tài liệu đã được cập nhật. Hãy để kiểm tra thông qua vỏ Mongo.
Hai giá trị đã được thêm vào - Texas và Detroit. Nó không thêm New York vì nó đã có mặt. Đây là cách $ Addtoset hoạt động.
$push
Toán tử $ Push có phần giống với toán tử $ Addtoset. Sự khác biệt là nó thêm các giá trị vào một mảng ngay cả khi chúng đã có mặt. Hãy để thêm vào New York New York, nơi giá trị của trường tên là John John.
12345678910111213 | router.route ["/update"]. đặt [function [req, res] {& nbsp; chi tiết.updateone [& nbsp; & nbsp; {name: "John"}, & nbsp; & nbsp; New York "]}}, & nbsp; & nbsp; function [err, result] {& nbsp; & nbsp; & nbsp; if [err] {& nbsp; & nbsp; } other {& nbsp; & nbsp; & nbsp; & nbsp; res.send [result]; & nbsp; & nbsp; & nbsp;} & nbsp; & nbsp;} & nbsp;];}];route["/update"].put[function[req, res] { |
Hãy để thực hiện và xem những gì xảy ra.
Nhà điều hành $ Push đã thêm vào New New York, trong các địa điểm ngay cả khi nó đã có mặt ở đó. Đây là sự khác biệt giữa toán tử $ Addtoset và $ Push.
$pop
Toán tử $ pop sẽ loại bỏ một phần tử khỏi một mảng, từ bắt đầu hoặc kết thúc. Chúng tôi sẽ loại bỏ một yếu tố từ cả hai bên. Cú pháp của $ Pop khá giống với toán tử $ Push. Sự khác biệt duy nhất là, thay vì một mảng là giá trị, chúng ta sử dụng 1 hoặc -1. Nếu giá trị được chỉ định là 1, phần tử cuối cùng sẽ bị xóa và nếu giá trị là -1, phần tử đầu tiên sẽ bị xóa. Hãy bắt đầu bằng cách loại bỏ yếu tố cuối cùng, tức là, New York, từ tài liệu trong đó giá trị của trường tên là là John John.
123456789101112 | router.route ["/update"]. đặt [function [req, res] {& nbsp; chi tiết.updateone [{name: "john"}, {$ push: {vị trí: 1}}, hàm err, & nbsp; & nbsp; result & nbsp;] {& nbsp; & nbsp; if [err] {& nbsp; & nbsp; kết quả]; & nbsp; & nbsp;} & nbsp;}];}];route["/update"].put[function[req, res] { |
Đúng! Giá trị cuối cùng đã bị xóa. Bây giờ, hãy để loại bỏ giá trị đầu tiên, cũng là New York New York. Lần này, chúng ta phải cho -1 là giá trị.
123456789101112 | router.route ["/update"]. đặt [function [req, res] {& nbsp; chi tiết.updateone [{name: "john"}, {$ push ; err, & nbsp; & nbsp; result & nbsp;] [kết quả]; & nbsp; & nbsp;} & nbsp;}];}];route["/update"].put[function[req, res] { |
Đúng! Giá trị đầu tiên cũng bị xóa.
Sự kết luận
Cảm ơn bạn đã kiểm tra bài viết cơ sở kiến thức của chúng tôi! Chúng tôi hy vọng bạn thích trình diễn này về một số chức năng mà chúng tôi có thể sử dụng để cập nhật các mảng với Mongoose.
Phi công nền tảng Objectrocket miễn phí!
Hãy thử được quản lý đầy đủ gián, Elaticsearch, MongoDB, PostgreSQL [beta] hoặc redis.
Bắt đầu