Bukan mongodb
ahli tetapi, jika saya memahami Anda dengan benar, Anda ingin bidang _id dari subdokumen dimasukkan secara otomatis.
Saya membuat threads
db lalu masukkan message
pertama di message
koleksi menggunakan perintah berikut:
db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]});
Perhatikan _id:ObjectId()
bidang. Hasilnya adalah sebagai berikut:
Sekarang saya memiliki ObjectId(56...)
, saya dapat memperbarui catatan tertentu dan menyisipkan lebih banyak pesan ke dalamnya. Dan perintahnya adalah sebagai berikut:
db.messages.update({"_id":ObjectId("56...")},
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});
Dan di atas akan menyisipkan pesan baru dalam koleksi. Lihat tangkapan layar di bawah ini:
dan akhirnya setelah beberapa pembaruan, koleksinya terlihat sebagai berikut:
Semua bidang _id di messages
array dibuat secara otomatis.
Mungkin bukan ide yang baik untuk menggunakan _id
lapangan karena berbagai alasan. Silakan Google untuk detail lebih lanjut tentang apakah akan menggunakan _id sebagai kunci untuk subdokumen atau tidak.
Saya menggunakan MongoDB shell versi 3.0.6 untuk perintah.
EDIT 28-01-2016 16:09
Karena solusi di atas didasarkan pada shell MongoDB, saya memutuskan untuk melakukan tes lain menggunakan driver Node.js untuk MongoDB. Pertama-tama, saya mendeklarasikan variabel ObjectID sebagai berikut
var ObjectID = require('mongodb').ObjectID;
Saya akan menggunakan ObjectID dengan id dokumen utas tempat pesan harus dimasukkan sebagai berikut dalam update
saya dan findOneAndUpdate
panggilan fungsi
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);
});
});
Diuji keduanya dan berfungsi dengan baik. Lihat tangkapan layar di bawah ini: