Verbinden des Sammlungsunterdokuments mit anderen Sammlungsunterdokumenten unter Verwendung des aggregierten Mongodb-Mungos

Aug 15 2020

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.jenismit 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 Aug 15 2020 at 18:59

Sie können dies versuchen,

  • $match Ihre Bedingungen
  • $unwindprodukArray dekonstruieren
  • $lookup mit Pipeline
    • $unwindjenisArray dekonstruieren
    • $match Spiel jenis._id
    • $projectnur zu zeigen _idundlabel
  • $unwind im Weg dekonstruieren produk.jenisnya
  • $group von _id und drücke in produk
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