6

スラッグまたはIDのいずれかでクエリできるマングースクエリを作成しようとしていますが、これを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);
         }
         // ....
     });
});

どちらでも検索できるようにしたいのですが、上記のこのアプローチでは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) {
             // ...
             });
         }
         // ....
     });
});

私が考慮していない他のアプローチはありますか?slug を ObjectId に変換できることはわかっていますが、できればこれは避けたいと思います。

4

2 に答える 2

6

私は間違いなく次の構文を好みます (Mongoose バリデーターの使用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)
});
于 2017-01-04T09:19:02.023 に答える
6

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);
        }
        // ....
    });
});
于 2012-12-11T18:10:00.993 に答える