我很好奇Grails的MongoDB插件如何处理关系。为了测试这个,我用两个域类创建了一个非常简单的应用程序:
Author
有两个字段:String firstName
和String lastName
Book
有两个字段:String title
和Author author
在设置了MongoDB和Grails后,我制作了一些Author
和Book
s并使用MongoDB交互式shell进行了查看。我发现关系的处理方式与在关系数据库中处理的方式相同:对其他对象的id字段的引用。
现在问题是:
编辑:我还注意到grails没有在我的作者的'id'属性上正确排序。这与使用MongoDB有关吗?在shell中,我可以看到Grails生成的所有文档的_id属性都是数据类型NumberLong
。
答案 0 :(得分:3)
我意识到MongoDB不应该是关系型的,但有些事情我不知道如何在不重复数据的情况下绕过关系
然后不要出汗。 MongoDB不是反关系的,它是面向文档的。
在这种情况下,书籍和作者是两个顶级对象。嵌套其中任何一个都是不合理的,它们本身就是核心实体。
如果每本书只有一个作者(N:1),那么本书包含作者的“参考”是完全合理的。当然你必须做两个查询。但这与进行连接查询有很大不同吗?连接查询仍然需要进行两次索引查找和两次数据查找。所以你在这里没有任何成本。
如果每本书都支持多位作者(M:N),那么您可以根据自己的需要several options。
我不认为MongoDB是“not relational”,我认为将MongoDB视为查询优化更为清晰。
我也注意到grails没有在我的作者的'id'属性上正确排序......
我会直接与Grails作者联系。听起来他们可能正在存储“字符串”而不是实际的ObjectIds(或MongoID)。虽然不重要,但这可能是一个错误。
答案 1 :(得分:1)
关于id属性,文档现在显示您可以在域类中声明ObjectId id
或String id
,以便不使用使用迭代long的默认GORM实现。只需在您的课程中声明该字段,插件就可以完成剩下的工作。