Bagaimana cara mengisi "komponen" di dokumen contoh:
{
"__v": 1,
"_id": "5252875356f64d6d28000001",
"pages": [
{
"__v": 1,
"_id": "5252875a56f64d6d28000002",
"page": {
"components": [
"525287a01877a68528000001"
]
}
}
],
"author": "Book Author",
"title": "Book Title"
}
Ini adalah JS saya di mana saya mendapatkan dokumen oleh Mongoose:
Project.findById(id).populate('pages').exec(function(err, project) {
res.json(project);
});
...populate('pages pages.page.components').exec...
saya mendapatkan hal yang sama seperti yang tertera pada contoh dokumen. Tidak ada yang berubah.Jawaban:
Mongoose 4.5 mendukung ini
Dan Anda dapat bergabung dengan lebih dari satu level yang dalam
sumber
pages.$.page.component
tidakpages.$.component
. Bagaimana cara mengetahui untuk melihat objek halaman?Itu berhasil untuk saya:
Dokumentasi: Model.populate
sumber
Seperti yang telah dicatat orang lain,
Mongoose 4
dukung ini. Sangat penting untuk dicatat bahwa Anda juga dapat mengulang lebih dalam dari satu level, jika perlu — meskipun tidak dicatat dalam dokumen:sumber
Anda dapat mengisi beberapa dokumen bersarang seperti ini.
sumber
populate: ['components','AnotherRef']
populate: 'components AnotherRef'
Ini adalah solusi terbaik:
sumber
page
memiliki properti lain yang tidak dapat diisi.Saya menemukan ini sangat membantu membuat feathersjs sebelum kait untuk mengisi hubungan dalam tingkat 2 referensi. Model luwak begitu saja
lalu di feathersjs before hook:
Sangat sederhana dibandingkan dengan beberapa metode lain yang saya coba untuk mencapai ini.
sumber
Saya menemukan pertanyaan ini melalui pertanyaan lain yang khusus KeystoneJS tetapi ditandai sebagai duplikat. Jika ada orang di sini yang mungkin mencari jawaban Keystone, beginilah cara saya melakukan kueri deep populate di Keystone.
Luwak populasi dua tingkat menggunakan KeystoneJs [duplikat]
sumber
Anda dapat melakukan ini dengan menggunakan
$lookup
agregasi juga dan mungkin cara terbaik karena sekarang populasinya mulai punah dari mongosumber
Mongoose 5.4 mendukung ini
sumber
Untuk seseorang yang memiliki masalah dengan
populate
dan juga ingin melakukan ini:clients
,users
,rooms
,messasges
.refPath
atau referensi dinamispopulate
denganpath
danmodel
opsifindOneAndReplace
/replaceOne
dengan$exists
KONTEKS
Tujuan
clients
,users
&bot
.clients
atauusers
dengan Model Mongoose-nya. _sender type client models isclients
, for user isusers
.Skema pesan :
LARUTAN
Permintaan API sisi server saya
Kode saya
Fungsi utilitas (dalam
chatUtils.js
file) untuk mendapatkan jenis pesan yang ingin Anda simpan:Sisi server saya (menggunakan Nodejs) untuk mendapatkan permintaan menyimpan pesan:
TIPS :
Untuk database:
refPath
, kami menggunakan utilgetSenderModel
yang digunakan dipopulate()
. Ini karena bot. Thesender.type
dapat:users
dengan database-nya,clients
dengan database danbot
tanpa database. TherefPath
perlu referensi Model yang benar, jika tidak, Mongooose melempar kesalahan.sender._id
dapat berupa tipeObjectId
untuk pengguna dan klien, ataunull
untuk bot.Untuk logika permintaan API:
quickReply
pesan (Message DB harus memiliki hanya satu quickReply, tetapi sebanyak yang Anda inginkan). Kami menggunakanfindOneAndUpdate
alih - alihreplaceOne
ataufindOneAndReplace
.findOneAndUpdate
) danpopulate
operasi dengancallback
masing-masing. Hal ini penting jika Anda tidak tahu apakah penggunaanasync/await
,then()
,exec()
ataucallback(err, document)
. Untuk info lebih lanjut lihat Populate Doc .overwrite
opsi dan tanpa$set
operator kueri.upsert
opsi.findOneAndUpdate
dan untukpopulate()
.populate
, kami membuat referensi Model dinamis kustom dengangetSenderModel
. Kita dapat menggunakan referensi dinamis Mongoose karenasender.type
forbot
tidak memiliki Model Mongoose. Kami menggunakan Populating Across Database denganmodel
danpath
optins.Saya telah menghabiskan banyak waktu untuk memecahkan masalah kecil di sana-sini dan saya harap ini akan membantu seseorang! 😃
sumber
Saya berjuang dengan ini selama satu hari penuh darah. Tidak ada solusi di atas yang berhasil. Satu-satunya hal yang berhasil dalam kasus saya untuk contoh seperti berikut:
adalah melakukan hal berikut: (Dengan asumsi mengisi setelah pengambilan - tetapi juga berfungsi saat memanggil populate dari kelas Model (diikuti oleh exec))
Dengan kata lain, properti jalur terluar harus berisi jalur lengkap. Tidak ada jalur yang sebagian lengkap yang digabungkan dengan properti populate yang tampaknya berfungsi (dan properti model tampaknya tidak diperlukan; masuk akal karena disertakan dalam skema). Butuh waktu satu hari penuh untuk memikirkan ini! Tidak yakin mengapa contoh lainnya tidak berhasil.
(Menggunakan Mongoose 5.5.32)
sumber
Hapus referensi dokumen
Ini berhasil untuk saya.
sumber