2016-10-17 4 views
0

Ich arbeite an einem Meteor-Projekt, wo ich einige Mongo-Sammlungen habe und ich bin mir nicht sicher, wie ich mit Beziehungen und dem Paket der Meteor-Sammelhelfer umgehen soll.Mongodb eingebettete Objekte und Meteor-Sammelhelfer

Bis jetzt haben wir eingebettete Dokumente gespeichert, so haben wir zum Beispiel eine Praktikumsammlung und jedes Praktikum hat ein eingebettetes Dokument mit dem Benutzer (Besitzer), der dieses Praktikum erstellt hat.

Wir haben uns entschieden, das Paket Meteor collection helpers (https://github.com/dburles/meteor-collection-helpers) zu verwenden, damit wir Methoden hinzufügen können, die die von uns benötigten Werte zurückgeben. Das Problem ist, dass die eingebetteten Dokumente ihre angegebenen Methoden verloren haben.

In den Praktika würden wir nur die entsprechende Sammlung ID speichern, und wenn wir die Praktikanten.Adresse, die in 3 verschiedenen Eigenschaften Straße, Postleitzahl und Stadt unterteilt ist, müssten wir nur 'Praktikum.getAddress aufrufen() " Ein anderes Beispiel wäre, die Praktikumsadresse zu erhalten, wenn Sie mit einem Bewerbungsdokument zu tun haben. Sie könnten die Methode Application.getInternship(). GetAddress() aufrufen. Dadurch müssen wir kein eingebettetes Dokument speichern.

Das Problem entsteht, wenn wir eine Mongo-Abfrage mit verschiedenen Feldern durchführen müssen. Wir haben eine sehr einfache Suchfunktion, die alle Dokumente zurückgibt, die eine bestimmte Zeichenfolge entspricht:

Application.search = (query) => { 
    Application.find({ 
     'applicant._id': Meteor.userId(), 
     $or: [ 
      {"internship.title": { $regex: query, $options: 'i' }}, 
      {"internship.description": {$regex: query, $options: 'i' }}, 
     ], 
    }, {sort: { updatedAt: -1 }, 
    }).fetch(); 
} 

Internship.title und descripion werden nicht mehr im Praktikum eingebetteten Dokument gespeichert werden, so fragen wir uns, wie man damit umgehen.

Antwort

0

Lasst uns sagen, dass Ihre Applications Sammlung auf Ihren Internships Sammlung durch eine Array verwandt ist von internshipIds in der Applications Sammlung. Dann können Sie wie folgt vorgehen:

Application.search = (query) => { 
    // find cursor internships that match the query 
    const matchingInternships = Internships.find({ 
    $or: [ 
     {title: { $regex: query, $options: 'i' }}, 
     {description: {$regex: query, $options: 'i' }} 
    ] 
    }); 
    // extract the list of _ids from this cursor 
    const intershipIds = matchingInternships.map(i=>{return i._id}); // array of internshipIds 
    Application.find({ 
    'applicant._id': Meteor.userId(), 
    internshipId: {$elemMatch: internshipIds } // look for internshipIds that are in the array 
    },{sort: { updatedAt: -1 }, 
    }).fetch(); 
} 

Diese etwas analog verschachtelte SQL-SELECT-Anweisungen zu tun, ex:

SELECT * FROM APPLICATIONS WHERE internshipID IN 
    (SELECT ID FROM INTERNSHIPS WHERE 
    (title LIKE query OR description LIKE query) 
); 
Verwandte Themen