Không phải là mongodb
chuyên gia nhưng, nếu tôi hiểu bạn chính xác, bạn muốn trường _id của tài liệu con được chèn tự động.
Tôi đã tạo threads
db và sau đó chèn message
đầu tiên trong messages
bộ sưu tập bằng cách sử dụng lệnh sau:
db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]});
Lưu ý _id:ObjectId()
đồng ruộng. Kết quả như sau:
Bây giờ tôi có một ObjectId(56...)
, Tôi có thể cập nhật bản ghi cụ thể đó và chèn thêm tin nhắn vào đó. Và lệnh như sau:
db.messages.update({"_id":ObjectId("56...")},
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});
Và ở trên sẽ chèn thông điệp mới vào bộ sưu tập. Xem ảnh chụp màn hình bên dưới:
và cuối cùng sau một vài cập nhật, bộ sưu tập trông như sau:
Tất cả các trường _id trong messages
mảng được tạo tự động.
Có thể không phải là một ý kiến hay khi sử dụng _id
các lĩnh vực vì nhiều lý do khác nhau. Vui lòng Google để biết thêm chi tiết về việc có nên sử dụng _id làm khóa cho các tài liệu phụ hay không.
Tôi đã sử dụng MongoDB shell phiên bản 3.0.6 cho các lệnh.
CHỈNH SỬA 28-01-2016 16:09
Vì giải pháp trên dựa trên MongoDB shell, tôi quyết định thực hiện một thử nghiệm khác bằng cách sử dụng trình điều khiển Node.js cho MongoDB. Trước hết, tôi khai báo biến ObjectID như sau
var ObjectID = require('mongodb').ObjectID;
Tôi sẽ sử dụng ObjectID với id tài liệu của chuỗi mà thông báo sẽ được chèn vào như sau trong update
của tôi và findOneAndUpdate
lệnh gọi hàm
app.get('/insertNewMessage', function(req, res) {
db.collection("messages").findOneAndUpdate({
_id: new ObjectID('56aa3554e90911b64c36a424')
}, {
$push: {
messages: {
_id: new ObjectID(),
message: "From NodeJS with <3 using findOneAndUpdate.Bye."
}
}
}, function(err, result) {
if (err)
res.json(err);
else
res.json(result);
});
});
Đã thử nghiệm cả hai và hoạt động tốt. Xem ảnh chụp màn hình bên dưới: