2016-06-19 4 views
0

Ich möchte eine Möglichkeit schaffen, eine Sammlung von Reisen zu durchsuchen. Bei der Suche wird geprüft, ob die Reise die Namen der übergebenen Städte (von und nach Ort) enthält. Jedes Reisemodell hat die ID des Benutzers, der den Eintrag erstellt hat. Die Abfrage kann 0 oder 100 Elemente in der Auflistung zurückgeben. Ich muss Daten über den Benutzer in den Suchergebnissen anzeigen. Was ist der beste Weg für mich, die Reiseinformationen zu suchen und auch die Benutzerinformationen zu erhalten.Führen Sie eine Textsuche in mongoDB durch und suchen Sie nach Referenzdokumenten für jeden Artikel in der Sammlung.

Jede Fahrt in den Ergebnissen kann einen anderen Benutzer haben.

Ich habe darüber nachgedacht, die Benutzerinformationen in das Auslösemodell einzubetten, aber dann muss ich eine Strategie haben, um die Informationen jedes Mal zu aktualisieren, wenn sich die Benutzerinformationen ändern. Die Beziehung zwischen Nutzer und Nutzer wird immer eins zu eins sein. Derzeit binde ich nur die Benutzerkennung ein. Dies funktioniert gut, wenn ich eine Reise zu einer Zeit abfrage, aber nicht für eine Suche.

Aktuelle Abfrage: Auf der Suche nach einer Übereinstimmung im Text

module.exports = function(app) { 
    app.get('/search', function(req, res) { 
    var search = req.query; 
    var query = {}; 

    if(search.origin) { 
     query.origin = { 
      $regex: search.origin, 
      $options: 'i', 
     }; 
    } 

    if(search.destination) { 
     query.destination = { 
      $regex: search.destination, 
      $options: 'i', 
     }; 
    } 

    Trip.find(query, function(err, trips) { 
     if(err) return res.json(err); 

     return res.json(trips);    
    }); 
}); 

Reise Modell:

var TripSchema = mongoose.Schema({ 
    user: { 
     type: Schema.Types.ObjectId, 
     required: true 
    }, 
    origin: { 
     type: String, 
     required: true 
    }, 
    destination: { 
     type: String, 
     required: true 
    }, 
    departing: { 
     type: Date, 
     required: true 
    }, 
    returning: { 
     type: Date 
    }, 
}); 

Benutzermodell:

var UserSchema = mongoose.Schema({ 
    name: { 
     type: String 
    }, 
    username: { 
     type: String 
    }, 
    password: { 
     type: String, 
    } 

}); 
+0

Was haben Sie sich schon ausgedacht? –

+0

@MedetTleukabiluly Ich habe meine Frage aktualisiert. Derzeit führe ich eine Überprüfung durch, um festzustellen, ob der angegebene Ursprung und das Ziel in vorhandenen Dokumenten enthalten sind. Ich habe noch nicht herausgefunden, wie man effizient durch das Array mit den Rückflugauslösungen geht und auch die Benutzerinformationen erhält. –

+0

hmm könnten Sie Ihr Schema zeigen? Es ist jetzt ein bisschen mehrdeutig. – profesor79

Antwort

0

Ich bin nicht wirklich sicher, ob ich das tat richtig, aber ich habe so etwas gemacht. Zuerst bekomme ich die Fahrten von meinem db basierend auf dem Suchstring. Die Suche basiert auf Herkunft und Ziel einer Reise. Sobald ich die Liste der Reisen habe, wiederhole ich das Array und erhalte die ID jedes Benutzers und schiebe ihn in ein anderes Array. Ich nehme dieses Array und ich verwende die db.model.find() Methode mit dem Operator , um die Benutzer aus dem Array zu finden.

Da ich jede Fahrt brauche, um ein Benutzerobjekt zu haben, iteriere ich noch einmal durch die Fahrten und weise den Benutzer obj der Fahrt zu.

Ich musste einige Konvertierungen zu JSON wegen der Art von Objekt Mungo-Returns machen. Ich kann nicht einfach eine neue Eigenschaft zuweisen. Ich konvertierte es in JSON mit der toJSON() Methode.

Wenn jemand einen besseren Ansatz kennt oder Ideen hat, wie der Code verbessert werden kann, ist jedes konstruktive Feedback willkommen.

app.get('/search', function(req, res) { 
    if(!req.query.origin || !req.query.destination){ 
     return res.json({trips: []}); 
    } 

    var search = req.query; 
    var query = {}; 

    if(search.origin) { 
     query.origin = { 
      $regex: search.origin, 
      $options: 'i', 
     }; 
    } 

    if(search.destination) { 
     query.destination = { 
      $regex: search.destination, 
      $options: 'i', 
     }; 
    } 

    Trip.find(query, function(err, trips) { 
     if(err) return res.json(err); 

     var userIds = []; 

     //get user ids from trip 
     trips.forEach(function(trip) { 
      userIds.push(mongoose.Types.ObjectId(trip.user)); 
     }); 

     var user = User.find({ 
      '_id': { $in: userIds} 
     }); 

     user.select('id name'); 
     user.exec(function (err, users) { 
      if (err) return res.json(err); 

      var jsonTrips = []; 
      var currentTrip; 

      trips.forEach(function(trip) { 
       currentTrip = trip.toJSON(); 
       currentTrip.user = findTripUser(trip.user, users); 
       jsonTrips.push(currentTrip); 
      }); 

      return res.json(jsonTrips); 
     }); 
    }); 
}); 

function findTripUser(tripId, users) { 
    var user; 
    for(var i = 0; i < users.length; i++) { 
     if(JSON.stringify(users[i]._id)=== JSON.stringify(tripId)) { 
      user = users[i]; 
      break; 
     } 
    } 

    return user.toJSON(); 
} 
Verwandte Themen