我正在尝试创建一个可以通过slug或id进行查询的mongoose查询,但问题在于我不知道我将要处理哪一个,因为我将其作为Express路由:
app.get('/animals/dogs/:id', function (req, res, next) {
Dogs.find({$or: [{slug: id}, {_id: id}]}, function (err, docs) {
if (err) {
return next(err);
}
// ....
});
});
Run Code Online (Sandbox Code Playgroud)
我希望能够通过任何一种搜索,但是上面的方法会引发Invalid 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) {
// ...
});
}
// ....
});
});
Run Code Online (Sandbox Code Playgroud)
有没有其他方法我没有考虑过?我知道我可以把我的slu into变成ObjectId,但如果可能的话我宁愿避免这个.
小智 6
我绝对更喜欢以下语法(使用 Mongoose 验证器 for ObjectId):
const mongoose = require('mongoose');
const isObjectId = mongoose.ObjectId.isValid;
app.get('/animals/dogs/:id', function (req, res, next) {
const id = req.params.id;
const promise = isObjectId(id) ? Dogs.find(id) : Dogs.findOne({ slug: id });
promise.then(dog => res.send(dog)).catch(next)
});
Run Code Online (Sandbox Code Playgroud)
测试if是否id是有效的ObjectId,然后只在查询中包含该术语,如果它有效:
app.get('/animals/dogs/:id', function (req, res, next) {
var query = {$or: [{slug: id}]};
if (id.match(/^[0-9a-fA-F]{24}$/)) {
query.$or.push({_id: id});
}
Dogs.find(query, function (err, docs) {
if (err) {
return next(err);
}
// ....
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1307 次 |
| 最近记录: |