javascript 如何使用mongoose在node.js中自动删除字段值等于零的文档?

w51jfk4q  于 2022-12-25  发布在  Java
关注(0)|答案(1)|浏览(133)

我有一个产品集合,它有几个字段。其中一个是"productQuantity",它保存了该产品的编号,它看起来像这样:

const ProductSchema = new Schema({
  productName: {
    type: String,
    unique: true,
    required: true,
  },
  productBrand: {
    type: String,
    required: true,
  },
  productPrice: {
    type: String,
    required: true,
  },
  productPhoto: {
    type: String,
    required: true,
  },
  productQuantity: {
    type: Number,
    required: true,
  },
  slug: {
    type: String,
    unique: true,
  },
  category: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Category',
  },
});

例如,我给10的productQuantity,现在我有10个产品。
我有一个页面,我可以购买该产品,它看起来像这样:

此页面的HTML代码:

<div style="display:flex; justify-content: center;">
            <div style="border: 2px solid black;">
                <img style="width: 465.16px;" src="<%= productCard.productPhoto %>">
            </div>
            <div  style="border: 2px solid black; display: flex; flex-direction: column;">
                <div style="margin:30px;">
                    <%= productCard.productName %>
                </div>
                <div style="margin:30px;">
                  <%= productCard.productBrand %>
                </div>

                <ul  style="margin:30px; list-style-type: none; padding: 0px;">
                    <li style="margin-bottom: 7px;">Kategori: <%= productCard.category.categoryName %>  </li>
                    <li style="margin-bottom: 7px;">Marka: <%= productCard.productBrand %></li>
                    <li style="margin-bottom: 7px;">Garanti Süresi: 24 Ay</li>
                </ul>

                <form method="POST" action="/product/<%= productCard._id %>?_method=PUT" style="display:flex; align-items: center;" novalidate>
                    <div style="display: flex; border: 2px solid black; margin:30px; border-radius: 20px; overflow: hidden;">
                       <a id="azalt" style="text-decoration: none; color: black; background-color: antiquewhite; padding: 0px 10px;" href="javascript:void(0)"><i class="icon-minus"></i></a>
                        <input id="Quantity" style="text-align: center; width:100px;" type="text" value="1" name="quantity">
                        <a id="arttır" style="text-decoration: none; color: black; background-color: antiquewhite; padding: 0px 10px;" href="javascript:void(0)"><i class="icon-plus"></i></a>
                    </div>
                
                <button type="submit" style=" margin-right: 20px; width: 200px; height:50px; background-color: green; color: aliceblue; font-weight: 900;">
                    SATIN AL
                </button>
              </form>

            </div>
            
        </div>

当我单击绿色按钮时,它会根据旁边的数字购买产品数量。
路线

router.route('/:id').put(productController.buyProduct);

以及控制器,

exports.buyProduct = async (req,res) =>{
    let boughtItemQuantity = req.body.quantity;
    const product = await Product.findById(req.params.id);

    product.productQuantity = product.productQuantity - boughtItemQuantity;

    product.save();

    res.status(200).redirect("/")

}

当工作完成后,它会将用户重定向到列出产品的主页,所以我想做的是,当我有10个产品,而一个用户购买了其中的10个产品时,我希望该产品的文档被删除,这样它就不会出现在主页上。
我试过了

exports.buyProduct = async (req,res) =>{
    let boughtItemQuantity = req.body.quantity;
    const product = await Product.findById(req.params.id);

    product.productQuantity = product.productQuantity - boughtItemQuantity;

    product.save();

    if(product.productQuantity == 0) 
   {
     await findByIdAndRemove(req.params.id)
   }

    res.status(200).redirect("/")

}

但我想我不能在同一个控制器中更新和删除,因为它删除了文档,但没有将我重定向到主页面。所以基本上它不工作
所以我不知道如何实现,我应该写一个中间件或其他东西?
先谢了。

68bkxrlz

68bkxrlz1#

您应该对返回Promisesave()函数执行await操作。
此外,您还应该编写Product.findByIdAndRemove

exports.buyProduct = async (req, res) => {
  let boughtItemQuantity = req.body.quantity;

  const product = await Product.findById(req.params.id);

  product.productQuantity = product.productQuantity - boughtItemQuantity;

  await product.save();

  if (product.productQuantity <= 0) {
    await Product.findByIdAndRemove(req.params.id);
  }

  res.status(200).redirect('/');
};

相关问题