Verbinden des Sammlungsunterdokuments mit anderen Sammlungsunterdokumenten unter Verwendung des aggregierten Mongodb-Mungos
Also, ich habe diese Art von Modell
const produkSchema = new mongoose.Schema({
nama_produk: String,
etalase: {type: mongoose.Schema.Types.ObjectID, ref: 'kategori'},
kategori: {type: mongoose.Schema.Types.ObjectID, ref: 'kategori'},
jenis: {type: mongoose.Schema.Types.ObjectID, ref: 'kategori.jenis'},
bahan: String,
warna: String,
deskripsi: String,
foto_produk: [String],
harga: Number,
link_bukalapak: String,
link_shopee: String,
link_tokopedia: String,
}, {
weights: {
nama_produk: 5,
},
timestamps: true
})
const tokoSchema = new mongoose.Schema({
username: {type: String, trim: true},
password: {type: String, required: true, select: false},
merek: String,
listMerek: [{type: mongoose.Schema.Types.ObjectID, ref: 'produk'}],
deskripsi: String,
follower: [{type: mongoose.Schema.Types.ObjectID, ref: 'user'}],
email: {type: String, trim: true, unique: true},
instagram: String,
whatsapp: String,
website: String,
alamat: String,
foto_profil: String,
bukalapak: String,
shopee: String,
tokopedia: String,
fotoktp: String,
banner: [{
gambar: {type: String, required: true, trim: true},
order: {type: Number, required: true},
}],
produk: [produkSchema],
etalase: [{type: mongoose.Schema.Types.ObjectID, ref: 'kategori'}],
approve: {type: Number, default: 0}, // 0: pending, 1: reject, 2: approve
populer: {type: Boolean, default: false},
}, {timestamps: true});
exports.toko = mongoose.model("toko", tokoSchema);
const jenisSchema = new mongoose.Schema({
label: String,
gambar: String,
}, {timestamps: true})
const kategoriSchema = new mongoose.Schema({
label: String,
gambar: String,
jenis: [jenisSchema]
}, {timestamps: true});
Also, was ich beitreten möchte, ist, toko.produk.jenis
mit kategori.jenis
, aber wie Sie wissen, kann Mungo nicht zwischen Unterdokumenten füllen, ich habe versucht, toko.find().populate("produk.jenis", "label")
aber es zeigt Fehler Schema hasn't been registered for model "kategori.jenis". Use mongoose.model(name, schema)
irgendwelche Abfragevorschläge ? ich habe es versucht
{
$lookup: {
"from": "kategoris",
"localField": "produk.jenis",
"foreignField": "jenis",
"as": "jenisnya"
}
}
aber es scheint nicht zu funktionieren und stattdessen ein leeres Array zurückzugeben. Was soll ich machen? Soll ich mein Schema neu anordnen?
Antworten
1 turivishal
Sie können dies versuchen,
$match
Ihre Bedingungen$unwind
produk
Array dekonstruieren$lookup
mit Pipeline$unwind
jenis
Array dekonstruieren$match
Spieljenis._id
$project
nur zu zeigen_id
undlabel
$unwind
im Weg dekonstruierenproduk.jenisnya
$group
von _id und drücke inproduk
db.toko.aggregate([
{ $match: { _id: ObjectId("5f1d77aca53cb13980324c73") } }, { $unwind: "$produk" }, { $lookup: {
from: "kategoris",
as: "produk.jenisnya",
let: { pjid: "$produk.jenis" }, pipeline: [ { $unwind: "$jenis" }, { $match: { $expr: { $eq: ["$$pjid", "$jenis._id"] } } },
{ $project: { "jenis._id": 1, "jenis.label": 1 } } ] } }, { $unwind: { path: "$produk.jenisnya" } }, { $group: {
_id: "$_id", produk: { $push: "$produk" }, // you can add otehr fields as well like alamat alamat: { $first: "$alamat" }
}
}
])
Spielplatz