6 Stimmen

Mongoose - Abfrage $oder Slug/ID

Ich versuche, eine Mongoose-Abfrage zu erstellen, die entweder durch Slug oder id abfragen kann, aber das Problem kommt in, dass ich nicht weiß, welche ich gehen, um zu behandeln, wie ich dies als eine Express-Route haben:

app.get('/animals/dogs/:id', function (req, res, next) {
     Dogs.find({$or: [{slug: id}, {_id: id}]}, function (err, docs) {
         if (err) {
             return next(err);
         }
         // ....
     });
});

Ich würde gerne die Möglichkeit haben, nach beidem zu suchen, aber der obige Ansatz wirft ein Invalid ObjectId Fehler.

Ein anderer Ansatz wäre die Verschachtelung der Abfragen, was jedoch etwas umständlich ist:

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) {
             // ...
             });
         }
         // ....
     });
});

Gibt es einen anderen Ansatz, den ich nicht berücksichtigt habe? Ich weiß, dass ich meinen Slug in die ObjectId umwandeln könnte, aber ich würde dies lieber vermeiden, wenn möglich.

7voto

merlin Punkte 122

Ich bevorzuge definitiv die folgende Syntax (die Verwendung des Mongoose-Validators für 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)
});

6voto

JohnnyHK Punkte 289697

Test ob id eine gültige ObjectId ist, und nehmen Sie diesen Begriff nur dann in die Abfrage auf, wenn er gültig ist:

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);
        }
        // ....
    });
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X