Mongoose-查询$或slug/id
我正在尝试创建一个mongoose查询,它可以通过slug或id进行查询,但问题在于,我不知道我将处理哪一个查询,因为这是一条快速路线:Mongoose-查询$或slug/id,mongoose,Mongoose,我正在尝试创建一个mongoose查询,它可以通过slug或id进行查询,但问题在于,我不知道我将处理哪一个查询,因为这是一条快速路线: app.get('/animals/dogs/:id', function (req, res, next) { Dogs.find({$or: [{slug: id}, {_id: id}]}, function (err, docs) { if (err) { return next(err);
app.get('/animals/dogs/:id', function (req, res, next) {
Dogs.find({$or: [{slug: id}, {_id: id}]}, function (err, docs) {
if (err) {
return next(err);
}
// ....
});
});
我希望能够通过其中一种进行搜索,但是上面的这种方法会抛出一个无效ObjectId
错误
另一种方法是嵌套查询,但这感觉有点麻烦:
app.get('/animals/dogs/:id', function (req, res, next) {
Dogs.find({slug: id}, function (err, docs) {
if (err) {
return next(err);
}
if (!docs) {
Dogs.findById(id, function (err, docs) {
// ...
});
}
// ....
});
});
有没有其他我没有考虑过的方法?我知道我可以将slug转换为ObjectId,但如果可能的话,我宁愿避免这种情况。测试
id
是否为有效的ObjectId,然后仅在有效的情况下在查询中包含该术语:
app.get('/animals/dogs/:id',函数(req,res,next){
var query={$or:[{slug:id}]};
if(id.match(/^[0-9a-fA-F]{24}$/){
query.$or.push({u id:id});
}
Dogs.find(查询、函数(错误、文档){
如果(错误){
返回下一个(错误);
}
// ....
});
});
我肯定更喜欢以下语法(对ObjectId
使用Mongoose验证器):
const mongoose=require('mongoose');
const isObjectId=mongoose.ObjectId.isValid;
app.get('/animals/dogs/:id',函数(req,res,next){
const id=req.params.id;
const promise=isObjectId(id)?Dogs.find(id):Dogs.findOne({slug:id});
承诺。然后(狗=>res.send(狗)).catch(下一个)
});
啊,很棒的东西,我确实想知道是否有一个正则表达式可以匹配ObjectId的正则表达式——我来试试。