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);

我正在尝试创建一个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);
         }
         // ....
     });
});
我希望能够通过其中一种进行搜索,但是上面的这种方法会抛出一个
无效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的正则表达式——我来试试。