我正在尝试路由/: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运算符做错了什么?提前感谢
我一直在为同样的实现而挣扎。
让它发挥作用:
// 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
进行检查非常重要。
我从Mongoose警告中得到了这个提示,并通过这里的许多答案:
(节点:13749([MONGOOSE]警告:MONGOOSE:若要创建新的ObjectId,请尝试
Mongoose.Types.ObjectId
而不是使用Mongoose.Schema.ObjectId
。