2017-06-20 1 views
0

Heute habe ich den funktionalen Teil meiner Website fertiggestellt, also ging ich in den Bereich Secure-my-app der Entwicklung. Ich möchte den Benutzern nur den Inhalt geben, auf den sie sich beziehen, also möchte ich meinen Lehrern (= ein Benutzer mit user.role == "lehrer") nur den Zugang zu einer bestimmten Aufgabe geben, wenn ihre _id in ist das assignment.teachersList-Array von _ids. Ich möchte diese Verifizierung in der Veröffentlichung machen, so dass ich einen Cursor am Ende der Abfrage erhalten muss.(Mongo) Arrays von IDs: Wie soll ich es tun?

Nach OFFICIAL documentation of mongo auf der Suche, wie es scheint, zu tun, was ich soll so einfach sein will wie:

// in a publish 
Assignements.find({ teachersList: this.userId }); 

Doch diese mich falsch immer wieder. Erstens Angst vor einem dieses Kontext Problem zu sein, habe ich versucht, so etwas wie:

// in a publish 
let self = this; 
Assignements.find({ teachersList: self.userId }); 

und es ist nicht besser, habe ich noch nichts. Ich habe versucht, Cursor.map() zu benutzen und meine Bedingung dorthin zu setzen, aber da Karte keinen Cursor zurückbringt, erhalte ich die Daten, aber es funktioniert auch nicht, da wir in einer Veröffentlichung sind.

Es ist in dem Dokument geschrieben, dass der erste Versuch, den ich gemacht habe, funktionieren sollte, also keine Zweifel, ich mache etwas falsch, aber was ..? Jetzt beginne ich mich zu fragen, ob das Problem von der Tatsache herrührt, dass es ein Array von _ids ist. Im Moment ist es nur eine Reihe von Strings. Und es scheint, dass this.userId in einer Methode nur einen String zurückgibt .... Aber vielleicht liege ich falsch und ich sollte stattdessen Meteor.Mongo.ObjectId (the_string_id) Objekte verwenden?

Ok, das war's! Bitte, wenn Sie irgendeine Idee haben, warum solch eine einfache Frage nicht funktioniert, sagen Sie mir! Danke :)

Antwort

0

teachersList ist ein Array und keine ID. Sie versuchen, ein Dokument mit einer ID zu finden, die den Wert eines Arrays hat ... geht nicht zur Arbeit ...

Ich verwende dieses Muster normalerweise für alle privaten Besitzersammlungen: füge ein onInsert-Ereignis meiner Sammlung hinzu und Fügen Sie dann den Benutzer als ownerId dem einzufügenden Dokument hinzu. Dann, wenn es um die Veröffentlichung geht, veröffentliche ich alle Dokumente mit der ownerId des Benutzers. Sauber und einfach, keine Rollen selbst benötigt ...

Wenn jedoch entscheiden Sie nicht das Muster oben zu verwenden ...

Von MongoDB:

db.inventory.find({ tags: { $in: [ /^be/, /^st/ ] } })

Diese Abfrage wählt alle Dokumente In der Inventarsammlung, in der das Tag-Feld ein Array enthält, das mindestens ein Element enthält, das entweder mit "be" oder "st" beginnt.

In Meteor Ihre Frage etwas aussehen könnte:

Assignments.find({ownerId: { $in: teachersList}});

+0

Vielen Dank für Ihre Antwort und wieder ist Ihr Muster eine ziemlich gute Idee! Du hast mir etwas beigebracht :) Ich werde es wahrscheinlich in einem zukünftigen Projekt verwenden :) – xababafr

+0

Ich habe dieses Muster noch nicht gefunden, es vor einiger Zeit irgendwo in einem Tutorial gefunden, es ausprobiert und es behalten ... wenn du es bist glücklich mit der Antwort und es löst Ihr Problem, bitte markieren Sie es als eine Antwort zu vermeiden, dass andere Leute versuchen, es zu beantworten. – Mozfet

Verwandte Themen