2017-08-27 1 views
0

Vielen Dank an alle, die Unterstützung für die erste Schritt dieses Rätsels vor allem @ Gaëtan Rouziès und @Neil. Auf dieser thread funktionierte der Code perfekt für das betreffende Szenario. Ich möchte den gleichen Code für ein anderes ähnliches Szenario anpassen und ich muss noch verstehen, was falsch sein könnte. Dieses Mal habe ich eine coursemodule Sammlung, eine viele: viele Beziehungssammlung zwischen Kursen und Modulen, die nur coursesId und moduleId speichert. Da der Code perfekt funktioniert, habe ich einfach kopiert, eine kleine Änderung und kam unten auf den Code:Doing a 1: viele: viele beitreten in mongodb

courses(){ 
    var theslug = FlowRouter.getParam('myslug'); 
    var mySchoolDocs = SchoolDb.findOne({slug: theslug}); 
    var arrayModuleSchools = ModuleSchool.find({schoolId: mySchoolDocs._id}); 
    // Transform the array of document into an array with only the ids 
    var arrayModuleId = []; 
    arrayModuleSchools.forEach(function(moduleSchools){ 
     arrayModuleId.push(moduleSchools.moduleId); 
    }); 
    var coursetoMod = CourseModules.find({}, {moduleId: {$in: arrayModuleId}}); 
    if (coursetoMod) { 
     coursesArrayIds = []; 
     console.log(coursetoSchool); 
     coursetoMod.forEach(function (courseToModules) { 
      coursesArrayIds.push(courseToModules.coursesId); 
     }); 
     return Courses.find({_id: {$in: coursesArrayIds}}).fetch(); 
    } 
} 

Um genau zu sein, nur 2 Module existieren in der Modules Sammlung, mit ids - xfLM9DEzhCMYQpQ32 and PTbZQ9cTG9pByFsY2. Die CourseModule Sammlung hat dies hat docs:

{ 
    "_id" : "iXX4unJZRNcCw9bAm", 
    "moduleId" : "PTbZQ9cTG9pByFsY2", 
    "coursesId" : "FbgcdZxADHKRBj98z", 
    "createdAt" : ISODate("2017-08-25T16:36:17.173Z"), 
    "userId" : "n5rqFSHbhm7zqADyB" 
} 
{ 
    "_id" : "RAJJFjqAjGoDeNhko", 
    "moduleId" : "PTbZQ9cTG9pByFsY2", 
    "coursesId" : "ESAf6NGpZzXeioecp", 
    "createdAt" : ISODate("2017-08-25T16:36:17.182Z"), 
    "userId" : "n5rqFSHbhm7zqADyB" 
} 
{ 
    "_id" : "8ceuFwZK8Qduo5J5P", 
    "moduleId" : "xfLM9DEzhCMYQpQ32", 
    "coursesId" : "KnNj4GLcyMtvF8JmB", 
    "createdAt" : ISODate("2017-08-25T16:38:15.368Z"), 
    "userId" : "n5rqFSHbhm7zqADyB" 
} 

An dem Punkt, wo ich in der Konsole anmelden Ich habe, dass die selectorId ist nicht definiert:

L ... n.Cursor {Kollektion: LocalCollection, Sortierer: null, Matcher: M ... o.Matcher, _selectorId: undefiniert, überspringen: undefiniert ...} _projectionFn: (OBJ) _selectorId: undefined_transform: nullcollection: LocalCollectionfields: undefinedlimit: undefinedmatcher: Minimongo.Matcherreactive: trueskip: undefinedsorter: null__proto__: Object_depend: (Wechslern, _allow_unordered) _getCollectionName: () _getRawObjects: (Optionen) _publishCursor: (sub) Konstruktor: (Sammlung, Selektor, Optionen) zählen:() fetch:() forEach: (Rückruf, thisArg) getTransform :() Karte: (Rückruf, thisArg) beobachten: (Optionen) beobachten Sie Änderungen: (Optionen) Zurückspulen:() Proto: Objekt view.js: 30 L ... n.Cursor {Sammlung: LocalCollection, Sortierer: null, Matcher: M ... o.Matcher, _selectorId: undefined, überspringen: undefined ...}

Alles, was ich tun möchte, ist die Kurse an einer bestimmten Schule zur Zeit über die Module angezeigt zu holen.

+0

Welche Konsole gibt diese Fehlermeldung? Die Chrom-Debugger-Konsole? Oder die "Meteor-Mongo" -Konsole? Oder die "Meteor" -Serverkonsole? –

Antwort

1

Sie verwenden die find Funktion den falschen Weg:

var coursetoMod = CourseModules.find({}, {moduleId: {$in: arrayModuleId}}); 

Die find() Funktion nimmt zwei Parameter: myCollection.find(query, projection). Wenn Sie Dokumente nach Feld filtern, muss es sich innerhalb des Parameters query befinden. Und der Parameter projection wird verwendet, um auszuwählen, welche Felder zurückgegeben werden sollen.

In Ihrem Fall sind hier die Parameter, die Sie verwenden: query: {} und projection: {moduleId: {$in: arrayModuleId}}.Aber es muss sein: query: {moduleId: {$in: arrayModuleId}}

So müssen Sie nur noch die $inals ersten Parameter verwenden:

var coursetoMod = CourseModules.find({moduleId: {$in: arrayModuleId}}); 

By the way, wenn Sie direkt auf die Dokumente, die von der find Funktion zurück sehen wollen innerhalb ein console.log, verwenden .fetch():

var coursetoMod = CourseModules.find({moduleId: {$in: arrayModuleId}}).fetch(); 

MongoDB Funktion Dokumentation: https://docs.mongodb.com/manual/reference/method/db.collection.find/

+0

Noch immer die gleiche Meldung auf der Konsole: '' 'L ... n.Cursor {Kollektion: LocalCollection, Sortierer: null, Matcher: M ... o.Matcher, _selectorId: undefined, überspringt: undefined ...}' '' – kehinde

+0

Wenn i Wenn Sie .fetch zur Abfrage hinzufügen, wird ein leeres Array zurückgegeben. '' '[]' '' – kehinde

+1

Die erste Nachricht ist normal, Ursache find() gibt ein Cursor-Objekt zurück. Mit der fetch() wissen wir, dass es 0 Dokument zurückgibt. Sie müssen mehr Daten prüfen: 'console.log (coursetoMod); console.log (arrayModuleId); console.log (CourseModules.find ({}) .fetch()); console.log (coursesArrayIds); 'Wenn Sie nicht sicher sind, prüfen Sie beim Debuggen, ob mehr Daten zur Verfügung stehen. –

1

@gaetan auf dem richtigen Weg mit der Antwort ist, müssen Sie die Abfrageparameter anstelle des Projektionsparameter verwenden. Es gibt einige andere Vereinfachungen, die in Ihrem Code mit der underscore-Bibliothek gemacht werden können, die mit Meteor gepackt wird.

courses() { 
    const slug = FlowRouter.getParam('myslug'); 
    const schoolId = SchoolDb.findOne({ slug })._id; 
    const Modules = ModuleSchool.find({ schoolId }); 
    const ModuleIds = _.pluck(Modules,'moduleId'); 
    const coursetoMod = CourseModules.find({ moduleId: { $in: ModuleIds }}); 

    if (coursetoMod.length) { 
    coursesIds = _.pluck(coursetoMod,'coursesId'); 
    return Courses.find({ _id: { $in: coursesArrayIds }}).fetch(); 
    } 
}