【问题标题】:(mongo) Arrays of ids : how should I do it?(mongo) ids 数组:我应该怎么做?
【发布时间】:2017-11-22 22:23:19
【问题描述】:

今天我完成了我网站的功能部分,所以我进入了开发的安全我的应用程序部分。我只想向用户提供与他们相关的内容,因此,对于我的老师(= 具有 user.role == "teacher" 的用户),我只想让他们访问给定的作业,如果他们的 _id 在_ids 的 assignment.teachersList 数组。我想在发布时进行此验证,因此我必须在查询末尾获得一个光标。

看了 OFFICIAL documentation of mongo 之后,似乎做我想做的事情应该很简单:

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

但是,这总是返回错误。首先,害怕 this 上下文问题,我尝试了类似的方法:

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

这并没有更好,我仍然一无所获。我尝试使用 Cursor.map() 并将我的条件放在那里,但由于地图没有返回光标,我得到了数据,但它也不起作用,因为我们正在发布中。

文档中写到我的第一次尝试应该可以工作,所以毫无疑问我做错了什么,但是什么..? 现在我开始怀疑问题是否出自 _ids 数组这一事实。现在,它只是一个字符串数组。而且似乎方法中的 this.userId 只返回一个字符串......但也许我错了,我应该使用 Meteor.Mongo.ObjectId(the_string_id)而是对象?

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

【问题讨论】:

    标签: arrays mongodb meteor


    【解决方案1】:

    teachersList 是一个数组,而不是一个 id。您正在尝试查找具有数组值的 id 的文档...无法正常工作...

    我通常在所有私有所有者集合上使用这种模式:将 onInsert 事件添加到我的集合中,然后将用户作为 ownerId 添加到正在插入的文档中。然后,在发布时,我使用用户的 ownerId 发布所有文档。干净简单,甚至不需要角色...

    但是,如果您决定不使用上述模式...

    来自MongoDB

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

    此查询选择清单集合中的所有文档,其中 tags 字段包含一个数组,该数组包含至少一个以 be 或 st 开头的元素。

    在 Meteor 中,您的查询可能类似于:

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

    【讨论】:

    • 再次感谢您的回答,您的模式是个好主意!你教会了我一些东西:)我可能会在未来的项目中使用它:)
    • 我没有想出那个模式,前段时间在教程的某个地方找到它,尝试过并保留它......如果你对答案感到满意并且它解决了你的问题,请将其标记为答案,以避免其他人试图回答。
    猜你喜欢
    • 1970-01-01
    • 2018-01-16
    • 2012-02-11
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多