Saya sudah mencari-cari jawaban yang baik, tetapi saya yakin saya kehilangan kata-kata yang tepat untuk menggambarkan apa yang saya cari.
Pada dasarnya saya memiliki koleksi mongodb yang disebut 'orang'. Skema untuk koleksi itu adalah sebagai berikut:
people: {
name: String,
friends: [{firstName: String, lastName: String}]
}
Sekarang, saya memiliki aplikasi ekspres yang sangat mendasar yang terhubung ke database dan berhasil membuat 'orang' dengan array teman kosong.
Di tempat kedua dalam aplikasi, formulir ada di tempat untuk menambah teman. Formulir mengambil firstName dan lastName dan kemudian POST dengan bidang nama juga untuk referensi ke objek orang yang tepat.
Apa yang saya kesulitan lakukan adalah membuat objek teman baru dan kemudian "mendorong" ke dalam array teman.
Saya tahu bahwa ketika saya melakukan ini melalui konsol luwak saya menggunakan fungsi pembaruan dengan $ push sebagai argumen kedua saya setelah kriteria pencarian, tetapi saya tidak bisa menemukan cara yang tepat untuk mendapatkan luwak untuk melakukan ini.
db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});
UPDATE: Jadi, jawaban Adrian sangat membantu. Berikut ini adalah apa yang saya lakukan untuk mencapai tujuan saya.
dalam file app.js saya, saya menetapkan rute sementara menggunakan
app.get('/addfriend', users.addFriend);
di mana di file users.js saya miliki
exports.addFriend = function (req, res, next)
{
var friend = {"firstName": req.body.fName, "lastName": req.body.lName};
Users.findOneAndUpdate({name: req.user.name}, {$push: {friends: friend}});
};
Jawaban:
Asumsi,
var friend = { firstName: 'Harry', lastName: 'Potter' };
Ada dua opsi yang Anda miliki:
Perbarui model dalam memori, dan simpan (plain javascript array.push):
atau
Saya selalu mencoba dan mencari opsi pertama jika memungkinkan, karena itu akan lebih menghargai manfaat yang diberikan luwak (kait, validasi, dll.).
Namun, jika Anda melakukan banyak penulisan bersamaan, Anda akan mendapatkan kondisi balapan di mana Anda akan berakhir dengan kesalahan versi yang buruk untuk menghentikan Anda mengganti seluruh model setiap kali dan kehilangan teman sebelumnya yang Anda tambahkan. Jadi hanya pergi ke yang pertama ketika itu benar-benar diperlukan.
sumber
update
fungsi, sementara itu TIDAK aman untuk menemukan dokumen, memodifikasi dalam memori, dan kemudian memanggil.save()
metode pada dokumen. Ketika saya mengatakan bahwa operasi itu 'aman', itu berarti bahwa bahkan jika satu, dua, atau 50 perubahan diterapkan ke dokumen, mereka semua akan berhasil diterapkan dan perilaku pembaruan akan seperti yang Anda harapkan. Pada dasarnya manipulasi di dalam memori tidak aman karena Anda bisa mengerjakan dokumen yang sudah usang sehingga saat Anda menyimpan, perubahan yang terjadi setelah langkah pengambilan hilang.let done = function(err, result) { // this runs after the mongoose operation }
Jawaban di atas memenuhi semua persyaratan, tetapi saya membuatnya bekerja dengan melakukan hal berikut
sumber
Gunakan
$push
untuk memperbarui dokumen dan memasukkan nilai baru di dalam array.Temukan:
hasil untuk menemukan:
memperbarui:
hasil untuk pembaruan:
sumber
Cara mudah untuk melakukannya adalah dengan menggunakan yang berikut:
sumber
Dalam kasus saya, saya melakukan ini
sumber
Saya mengalami masalah ini juga. Perbaikan saya adalah membuat skema anak. Lihat di bawah untuk contoh model Anda.
---- Model orang
*** Penting: SingleFriend.schema -> pastikan untuk menggunakan huruf kecil untuk skema
--- Skema anak
sumber