(mongo)ids数组:我应该怎么做?

时间:2017-06-20 11:34:47

标签: arrays mongodb meteor

今天我完成了我网站的功能部分,所以我进入了开发的安全应用程序部分。我想只向用户提供与他们相关的内容,因此,对于我的老师(=具有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)对象呢?

好吧,那就是它!如果你知道为什么这么简单的查询不起作用,请告诉我!谢谢:))

1 个答案:

答案 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}});