簡體   English   中英

MongooseJS:.populate() 不返回父字段 model

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM