如何正确使用 findOne mongoDB 查询?

Posted

技术标签:

【中文标题】如何正确使用 findOne mongoDB 查询?【英文标题】:How to use the findOne mongoDB query correctly? 【发布时间】: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 ),但它给了我整个数组而不是一个对象。

【问题讨论】:

【参考方案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")
   
));

【讨论】:

以上是关于如何正确使用 findOne mongoDB 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mongodb-native findOne() 中使用变量作为字段名?

为什么使用MongoDB中的findOne得到的是一个null呢

无法查询 findOne - SpringMVC MongoDB

如何使用 MongoDB 聚合 `$lookup` 作为 `findOne()`

MongoDB 确定一条记录是不是会通过 findOne

nodejs操作mongodb查询所有数据