【问题标题】:How to use the findOne mongoDB query correctly?如何正确使用 findOne mongoDB 查询?
【发布时间】:2021-11-26 13:10:10
【问题描述】:

我的目标是根据我标记为绿色的产品 ID(在我的 mongo DB 中的整个产品数组中)取回一个产品对象

我的后端条目如下所示:

router.get("/:id", async (req, res)=> {
  const mid=req.params.id;
  console.log(mid)
  const products = await Product.findOne({ id: mid })
  console.log(products)
  if (products) {
    res.send(products);
  } else {
    res.status(404).send({message:"product not found"})
  } 
});

Connsole.log(mid) 在第三行有效,它返回了正确的 id。但是,当我尝试根据第三行中的值过滤那个数组时,我总是会返回我的数据库的第一个对象,即 gopro 相机,而不是正确的对象。

输出如下:

632834528
{
  _id: '5f9849daf641a82b257d529b',
  id: 3484,
  agentId: 66343,
  title: 'GoPro Camera',
  slug: 'gopro',

我做错了什么?

我也试过const products = await Product.find({ id: mid }),但它给了我整个数组而不是一个对象。

【问题讨论】:

    标签: javascript arrays database mongodb mongoose


    【解决方案1】:

    我认为它正在返回一个查询。试试:

    const products = await Product.findOne({ id: mid }).exec();

    【讨论】:

    • 这也有效!
    • 您认为哪种解决方案更好(下面是您的还是我的?)以及为什么?
    • 我认为你根本不需要 expressAsyncHandler。有点奇怪,它竟然一开始就解决了你的问题
    【解决方案2】:

    这个解决方案对我有用: 我必须像这样使用 Expressasynchandler:

    编辑:此解决方案可能不是最好的(请参阅上面答案中的 cmets)

    router.get("/:id",  expressAsyncHandler(async (req, res) => {
      const mid=req.params.id;
      const products = await Product.findOne({ id: mid })
      if (products) {
        res.send([products]);
      } else {
        res.status(404).send({message:"product not found"})
      } 
    }));
    

    【讨论】:

      猜你喜欢
      • 2018-01-21
      • 1970-01-01
      • 2016-04-19
      • 1970-01-01
      • 2018-12-20
      • 2021-12-01
      • 1970-01-01
      • 2021-04-28
      • 2015-08-07
      相关资源
      最近更新 更多