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: