【问题标题】:Using DBRef in mongo go driver在 mongo go 驱动程序中使用 DBRef
【发布时间】:2020-04-02 18:54:33
【问题描述】:

我想将DBrefgo-mongo-driver 一起使用,但我找不到任何关于它的示例。我怎样才能做到这一点? 我之前使用过 Spring Data Mongodb,您可以在类中指定 Dbref,例如:

@DBRef private EmailAddress emailAddress;

有没有人可以举一个很好的例子? 提前致谢

【问题讨论】:

    标签: database mongodb go dbref mongo-go


    【解决方案1】:

    我之前使用过 Spring Data Mongodb,您可以在类中指定 Dbref

    除非您有令人信服的理由使用DBRefs,否则您应该避免使用它,或者改用manual references

    对于您发布的示例,您绝对应该首先尝试将EmailAddress 的值嵌入到文档中。使用嵌入式模型应该可以避免您为了检索 EmailAddress 值而两次查询数据库。另见Embedded Data Models

    type User struct 
    {
        ID           primitive.ObjectID `json:"ID" bson:"_id"`
        UserName     string             `json:"username"`
        EmailAddress Email              `json:"emailAddress"`
    }
    
    type Email struct 
    {
         PrivateEmail     string      `json:"private"`
         BusinessEmail    string      `json:"business"`
    }
    

    在某些情况下,您确实需要将相关信息存储在单独的文档中,您应该使用manual references。您可以通过将一个文档的_id 字段保存在另一个文档中作为参考来做到这一点。然后您的应用程序可以运行第二个查询以返回相关数据。从 MongoDB v3.4+ 开始,您可以使用 $lookup$graphLookup 来执行查找。

    MongoDB Go driver 不直接支持DBRef 类型。 Spring Data MongoDB 提供了一个方便的辅助方法,可以自动形成DBRef 的查询,尽管在后台它只是查询数据库两次。

    说了这么多,还有一些你需要的特殊情况,你可以像下面的例子那样构建你自己的结构:

    type User struct 
    {
        ID               primitive.ObjectID  `json:"ID" bson:"_id"`
        UserName         string              `json:"username"`
        EmailAddress     DBRef               `json:"emailAddress"`
    }
    
    type DBRef struct {
       Ref interface{}   `bson:"$ref"`
       ID  interface{}   `bson:"$id"`
       DB  interface{}   `bson:"$db"`
    }
    

    再次请注意,MongoDB 驱动程序不会自动解析DBRef。在驱动程序之上可能有框架或助手可以提供自动引用解析(通过执行第二个查询来查找值)。

    【讨论】:

    • 如果我的电子邮件对象经常更改怎么办?我认为您的第一个建议不适合我。手动参考似乎是最好的选择。你觉得@Wan Bachtiar 怎么样?
    • Email 对象,你的意思是 Email 结构吗?如果这种情况经常发生变化,那么您就不能拥有对象映射。这与在不知道结构的情况下解析 DBRef 相同。
    • 是的,我的意思是电子邮件结构。用户的电子邮件可能会经常更改@Wan Bachtiar。
    • 改变结构体和结构体内部属性的值是有区别的。通过更新操作很容易改变值。
    • 我认为您的意思是一对多,多对多对于用户/电子邮件关系没有意义或不常见。真的取决于你的用例。您可以拥有一对多并将电子邮件存储在不同的集合中并使用$lookup 加入用户和电子邮件,或者您可以拥有一对多并将一系列电子邮件嵌入到用户集合中。
    猜你喜欢
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    相关资源
    最近更新 更多