【问题标题】:Mongoid: retrieving documents whose _id exists in another collectionMongoid:检索 _id 存在于另一个集合中的文档
【发布时间】:2012-11-05 09:28:03
【问题描述】:

我正在尝试根据另一个集合中存在对这些文档的引用来从集合中获取文档。

假设我有两个集合 UsersCourses,模型如下所示:

  • 用户:{_id, name}
  • 课程:{_id, name, user_id}

注意:这只是一个假设示例,并非实际用例。所以让我们假设在Course 的名称字段中重复是可以的。让我们瘦Course as CourseRegistrations

在这里,我在Course 中保持对User 的引用,其中user_id 持有_IdUser。请注意,它存储为字符串。

现在我想检索注册到特定课程集的所有用户。

我知道这可以通过两个查询来完成。这是首先运行查询并从课程集的Course 集合中获取users_id 字段。然后使用$in 和上一个查询中检索到的用户ID 查询User 集合。但是如果文档数量在数万或更多,这可能并不好。

有没有更好的方法在一个查询中做到这一点?

【问题讨论】:

    标签: mongodb mongoid mongodb-ruby


    【解决方案1】:

    你说的是典型的sql join。但这在 mongodb 中是不可能的。正如您已经建议的那样,您可以在 2 个不同的查询中执行此操作。

    还有另一种处理方法。它不完全是一个解决方案,而是 NonSql 数据库中的有效解决方法。也就是将最常访问的字段存储在同一个集合中。

    您可以将user 集合中的一些字段作为嵌入字段存储在course 集合中。

    Course : {
       _id : 'xx',
       name: 'yy'
       user:{
           fname : 'r',
           lname :'v',
           pic: 's'
       }  
    }
    

    如果您打算从用户集合中检索的字段子集较少,这是一个很好的方法。您可能想知道 course 集合中存储的冗余用户数据,但这正是 mongodb 强大的原因。它是一次性插入,但您的查询会快得多。

    【讨论】:

    • 感谢您的回复。稍微扩展一下问题。可以说我也想使用分页。两种查询方式都行不通吧?我无法检索注册到特定课程集的用户页面。您的替代解决方案也可以与分页一起使用。
    猜你喜欢
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 2017-05-06
    • 1970-01-01
    • 2020-08-04
    • 2023-03-07
    相关资源
    最近更新 更多