【问题标题】:Mongoose Trying to populate猫鼬试图填充
【发布时间】:2021-05-19 06:55:38
【问题描述】:

我有一些问题

  1. 无法填充 CartProduct,只显示 ObjectId。
  2. 有没有办法让 CartProduct 每次创建时自动添加到?购物车。
  3. 这是正确的模式结构方式吗?

购物车

 const CartSchema = new Schema({
  active: { type: Boolean, required: true, default: true },
  createAt: { type: Date, default: Date.now },
  client: { type: Schema.Types.ObjectId, ref: "User", required: true },
 products: [{ type: Schema.Types.ObjectId, ref: "CartProduct" }],
 });

 const Cart = model("Cart", CartSchema);

购物车产品

const CartProductSchema = new Schema({
item: { type: Schema.Types.ObjectId, ref: "Product", required: true },
cart: { type: Schema.Types.ObjectId, ref: "Cart", required: true },
quantity: { type: Number, required: true },
totalPrice: { type: Number, required: true },
});

const CartProduct = model("CartProduct", CartProductSchema);

产品

 const ProductSchema = new Schema({
 name: { type: String, required: true },
 price: { type: Number, required: true },
 image: { type: String, required: true },
 category: { type: Schema.Types.ObjectId, ref: "Category", require: true },
  });

 const Product = model("Product", ProductSchema);

购物车控制器

router.post("/", async (req, res) => {
 try {
  const { userId } = req.body;
   const cart = await Cart.findOne({ client: userId 
  }).populate("CartProduct");

   if (cart === null) {
     const newCart = new Cart({
       client: userId,
     });

    await newCart.save();

   return res.status(201).send({ cart: newCart });
  }

   res.status(200).send({ cart });
 } catch (error) {
   res.status(500).send(error);
   }
  });

将产品添加到购物车

router.post("/addProductToCart", async (req, res) => {
try {
const { item, cart, quantity, price } = req.body;

const newProduct = new CartProduct({
  item,
  cart,
  quantity,
  totalPrice: price * quantity,
});

await newProduct.save();

await Cart.findOneAndUpdate(
  { _id: cart },
  { $push: { products: newProduct } },
  {
    new: true,
  }
);

res.status(201).send({ message: "New Product Added To Cart" });
} catch (error) {
  res.status(500).send(error);
}
});

将产品添加到购物车确实有效, 但填充不起作用

添加输出

{
"cart": {
    "active": true,
    "products": [
        "602bc081daf867167c2eb5da"
    ],
    "_id": "602aab802f625d1654805ef0",
    "client": "601c50211c94cf5d642c67fb",
    "createAt": "2021-02-15T17:12:32.997Z",
    "__v": 0
 }
}

【问题讨论】:

    标签: node.js mongodb express mongoose database-design


    【解决方案1】:

    您在 cartSchema 中缺少的 {

     const CartSchema = new Schema({
      active: { type: Boolean, required: true, default: true },
      createAt: { type: Date, default: Date.now },
      client: { type: Schema.Types.ObjectId, ref: "User", required: true },
     products: [{ type: Schema.Types.ObjectId, ref: "CartProduct" }],
     });
    

    像这样导出模型

    module.exports = Cart 
    

    有没有办法让 CartProduct 每次创建时自动添加到?购物车

    没有自动将CartProduct 中的_id 添加到collection,因此您应该使用findOneAndUpdate()find()push in to products arraysave()

    这是正确的模式结构方式

    是的。

    所以对于填充你可以尝试:

    let resultCarts = await Cart.find(filter).populate("products")
    let resultProducts = await Product.find(filter).populate("category")
    

    因此将CartProduct 更改为products,因为您应该将字段名称作为参数而不是架构名称传递

    await Cart.findOne({ client: userId 
      }).populate("products");
    

    【讨论】:

    • 我导出的和你说的一样,大括号是存在于代码中的,只是这里我忘记添加了
    • shokran ya zalame
    • 如果您的问题没有解决,请发表评论,否则接受我的回答,因为我们都获得了更多的声誉,其他用户可以看到这个答案解决了您的问题。看到这个链接stackoverflow.com/help/someone-answers
    • 填充仍然无法正常工作。我正在检查错误
    • 很难准确判断您的代码发生了什么,请提供更多代码,将控制器添加到问题中
    猜你喜欢
    • 2015-07-13
    • 2016-10-10
    • 2019-09-16
    • 2015-07-13
    • 2020-01-17
    • 2021-05-03
    • 2021-01-09
    • 2018-06-01
    相关资源
    最近更新 更多