[英]MongooseJS: .populate() does not return fields from the parent model
目前有 2 個模型產品和書籍; Book 繼承自 Product,如下所示:
const ProductSchema = new mongoose.Schema(
{
name: {...},
description: {...},
images: [{... }],
inventory: { ... },
department: { ... },
....
},
{
timestamps: true,
toJSON: { virtuals: true },
toObject: { virtuals: true },
discriminatorKey: "kind",
}
)
Model = mongoose.model("Product", productSchema)
const BookSchema = new mongoose.Schema({
subtitle: { ... },
abstract: { ... },
publisher: { ... },
authors: { ... },
...
},
{
timestamps: true, discriminatorKey: "kind",
toJSON: { virtuals: true },
toObject: { virtuals: true }
}
)
Book = Product.discriminator("Book", BookSchema)
此外,還有一個 Cart 模式,它有一個子文檔“products”,其中包含一個引用字段“bookID”,如下所示:
const cartItem = new mongoose.Schema({
productID: {
type: mongoose.Types.ObjectId,
ref: "Product",
required: [true, "Please provide productID. "]
},
quantity: { ... },
sessionID: { ... },
})
const cartSchema = new mongoose.Schema({
products: [cartItem],
active: {
type: Boolean,
default: true,
hide: true,
},
sessionID: {
type: mongoose.Types.ObjectId,
ref: "Session"
}
}, {
timestamps: true,
toJSON: { virtuals: true },
toObject: { virtuals: true },
})
Cart = mongoose.model("Cart", cartSchema)
我正在使用 mongoosejs v-6.8.3
問題是 Cart 實例上的 .populate() 僅返回 Book model 中的字段(不包括 Product 模型中的字段)。
newCart = new Cart({...})
newCart.save()
let populatedCart = await newCart.populate({ path: "products.productID", model: Product})
您的問題可能是 Mongoose 的鑒別器功能如何運作的結果。 Mongoose 將為子 model 構建一個新集合,並在您使用鑒別器方法生成新的 model 時將其文檔存儲在該集合中,該新 model 繼承現有的 model。填充時查詢的唯一集合在 Cart 實例上運行,它只填充 Book model 中的字段。此問題的一個潛在解決方法是在子模型的架構中顯式包含父 model 中的字段。 以這種方式,當對 Cart 實例執行填充時,將包含來自 Product model 的字段。 另一種方法是執行 fill 方法,並選擇選擇選項以包括父 model 中的所需字段。這是一個示例:
const ProductSchema = new mongoose.Schema({
name: {...},
description: {...},
images: [{... }],
inventory: { ... },
department: { ... },
....
}, {
timestamps: true,
toJSON: { virtuals: true },
toObject: { virtuals: true },
discriminatorKey: "kind"
});
const Model = mongoose.model("Product", productSchema);
const BookSchema = new mongoose.Schema({
subtitle: { ... },
abstract: { ... },
publisher: { ... },
authors: { ... },
...
}, {
timestamps: true,
toJSON: { virtuals: true },
toObject: { virtuals: true },
discriminatorKey: "kind",
});
const Book = Model.discriminator("Book", BookSchema);
const cartItem = new mongoose.Schema({
productID: {
type: mongoose.Types.ObjectId,
ref: "Product",
required: [true, "Please provide productID. "]
},
quantity: { ... },
sessionID: { ... },
});
const cartSchema = new mongoose.Schema({
products: [cartItem],
active: {
type: Boolean,
default: true,
},
sessionID: {
type: mongoose.Types.ObjectId,
ref: "Session"
}
}, {
timestamps: true,
toJSON: { virtuals: true },
toObject: { virtuals: true },
});
const Cart = mongoose.model("Cart", cartSchema);
let newCart = new Cart({...});
await newCart.save();
let populatedCart = await Cart.findById(newCart._id).populate({ path: "products.productID", model: "Product", select: '-__v' });
console.log(populatedCart);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.