Mongoose:通过slug$或id找到



我正在尝试路由/: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

最新更新