Mongoose:通过 slug $ 或 id 查找

发布于 2025-01-09 06:11:54 字数 435 浏览 0 评论 0原文

我正在尝试路由 /:slug,用户可以输入 _id 或 slugify 生成的 slug。

我正在路由控制器上尝试这个:

const query = await Tour.find({
  $or: [{ _id: req.params.slug }, { slug: req.params.slug }]
});

但它不起作用,我只有在这样做时才能使其工作:

 if (req.params.slug.includes('-')) {
  query = await Tour.find({ slug: req.params.slug });
} else {
  query = await Tour.findById(req.params.slug);
}

问题是:我使用 $or 运算符做错了什么?提前致谢

i'm trying to route /:slug and the user can type the _id or a slug generated by slugify.

i'm trying this on the route controller:

const query = await Tour.find({
  $or: [{ _id: req.params.slug }, { slug: req.params.slug }]
});

but it doesn't work, i only manage to make it work when i do this:

 if (req.params.slug.includes('-')) {
  query = await Tour.find({ slug: req.params.slug });
} else {
  query = await Tour.findById(req.params.slug);
}

the question is: what am i doing wrong using $or operator? thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

萌梦深 2025-01-16 06:11:54

我一直在为同样的实施而苦苦挣扎。

为了让它工作:

// Add this line
const { Types, isValidObjectId } = require('mongoose')

// Just placing slug on a const for readability
const { slug } = req.params 

// Change the query to:
const query = await Tour.find({
  $or: [
    { _id: isValidObjectId(slug) ? Types.ObjectId(slug) : undefined },
    { slug }
  ]
});

这里的技巧是像 { _id: Types.ObjectId(slug) } 一样查询 id,但问题是如果 slug 实际上是一个 slug 并且不是 ObjectId,Types.ObjectId(slug) 会破坏代码。因此,使用 isValidObjectId 进行检查非常重要。

我从猫鼬警告和这里的许多答案中得到了这个提示:

(node:13749) [MONGOOSE] 警告:mongoose:要创建新的 ObjectId,请尝试使用 Mongoose.Types.ObjectId 而不是使用 Mongoose.Schema.ObjectId

I have been struggling with the same implementation.

To make it work:

// Add this line
const { Types, isValidObjectId } = require('mongoose')

// Just placing slug on a const for readability
const { slug } = req.params 

// Change the query to:
const query = await Tour.find({
  $or: [
    { _id: isValidObjectId(slug) ? Types.ObjectId(slug) : undefined },
    { slug }
  ]
});

The trick here was to query the id like { _id: Types.ObjectId(slug) }, but the thing is if slug is actually a slug and not an ObjectId, Types.ObjectId(slug) will break the code. So it's important to make a check using isValidObjectId.

I got this tip from a Mongoose warning and through many answers here:

(node:13749) [MONGOOSE] Warning: mongoose: To create a new ObjectId please try Mongoose.Types.ObjectId instead of using Mongoose.Schema.ObjectId.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文