今天我完成了我网站的功能部分,所以我进入了开发的安全应用程序部分。我想只向用户提供与他们相关的内容,因此,对于我的老师(=具有user.role =="老师"的用户),我只想让他们访问给定的作业如果它们的_id位于_ids的.acachersList数组中。我想在发布中进行这个验证,所以我必须在查询的末尾得到一个光标。
在查看 OFFICIAL documentation of mongo 之后,似乎做我想要的应该是这样简单:
// in a publish
Assignements.find({ teachersList: this.userId });
然而,这总是让我失意。首先,我害怕这个上下文问题,我尝试过类似的事情:
// in a publish
let self = this;
Assignements.find({ teachersList: self.userId });
而且它并没有好转,我仍然一无所获。我试图使用Cursor.map()并将条件放在那里,但由于map没有返回光标,我得到了数据,但由于我们处于发布状态,因此它无法正常工作。
在文档中写道,我做的第一次尝试应该有效,所以毫无疑问我做错了什么,但是什么......? 现在我开始怀疑问题是否来自于它是 _ids 的数组。现在,它只是一个字符串阵列。似乎方法中的 this.userId 只返回一个字符串......但也许我错了,我应该使用 Meteor.Mongo.ObjectId(the_string_id)对象呢?
好吧,那就是它!如果你知道为什么这么简单的查询不起作用,请告诉我!谢谢:))
答案 0 :(得分:0)
teachersList是一个数组,而不是id。您正在尝试查找ID为具有数组值的文档...无法正常工作...
我通常在所有私有所有者集合上使用此模式:将onInsert事件添加到我的集合中,然后将用户作为ownerId添加到要插入的文档中。然后,在发布时,我使用用户的ownerId发布所有文档。干净简单,甚至不需要任何角色......
但是,如果您决定不使用上述模式......
来自MongoDB:
db.inventory.find( { tags: { $in: [ /^be/, /^st/ ] } } )
此查询选择清单集合中所有文档,其中tags字段包含一个数组,该数组至少包含一个以be或st开头的元素。
在Meteor中,您的查询可能类似于:
Assignments.find({ownerId: { $in: teachersList}});