it-swarm.com.de

Die Suchmethode von Mongoose mit $ oder condition funktioniert nicht richtig

Vor kurzem beginne ich MongoDB mit Mongoose auf Nodejs. 

Wenn ich die Model.find-Methode mit der $or-Bedingung und dem _id-Feld verwende, funktioniert Mongoose nicht ordnungsgemäß.

Das funktioniert nicht:

User.find({
  $or: [
    { '_id': param },
    { 'name': param },
    { 'nickname': param }
  ]
}, function(err, docs) {
   if(!err) res.send(docs);
});

Wenn ich den '_id'-Teil entferne, funktioniert dies übrigens!

User.find({
  $or: [
    { 'name': param },
    { 'nickname': param }
  ]
}, function(err, docs) {
   if(!err) res.send(docs);
});

Und in der MongoDB-Shell funktionieren beide ordnungsgemäß.

77
Younghan

Ich habe es durch googeln gelöst:

var ObjectId = require('mongoose').Types.ObjectId;
var objId = new ObjectId( (param.length < 12) ? "123456789012" : param );
// You should make string 'param' as ObjectId type. To avoid exception, 
// the 'param' must consist of more than 12 characters.

User.find( { $or:[ {'_id':objId}, {'name':param}, {'nickname':param} ]}, 
  function(err,docs){
    if(!err) res.send(docs);
});
155
Younghan

Ich flehe alle an, die Abfrage-Builder-Sprache von Mongoose zu verwenden und statt der Rückrufe Versprechungen zu machen:

User.find().or([{ name: param }, { nickname: param }])
    .then(users => { /*logic here*/ })
    .catch(error => { /*error logic here*/ })

Lesen Sie mehr über Mongoose Queries .

16
Govind Rai

Gemäß der mongoDB-Dokumentation: "... Damit MongoDB Indizes zur Auswertung von $ oder Ausdrücken verwenden kann, müssen alle Klauseln in $ oder expression von Indizes unterstützt werden." 

Fügen Sie also Indizes für Ihre anderen Felder hinzu und es wird funktionieren. Ich hatte ein ähnliches Problem und dieses Problem gelöst.

Sie können mehr hier lesen: https://docs.mongodb.com/manual/reference/operator/query/or/

0
Farasi78