【问题标题】:Data not fully retrieved while using mgo pipe function使用 mgo 管道功能时未完全检索数据
【发布时间】:2016-05-17 10:18:40
【问题描述】:

我在 mgo 中使用管道函数来检索数据。我的数据结构如下。

type Company struct {
    Id              bson.ObjectId `bson:"_id,omitempty"`
    CompanyName     string
    Slug            string
    CompanyUsers    []CompanyUser
}
type CompanyUser    struct {
    UserName    string
    Email       string
    FullName    string
}

我需要检查具有给定“Slug”的“公司”中的“公司用户”下是否存在给定的“用户名”。

Slug 和 UserName 均由用户提供。

使用 Pipe 函数我成功完成了搜索,但返回的数据是一个空的 CompanyUsers 数组。

我的查询如下:

var companyResults []Company

pipeline := []bson.M{
    {"$match": bson.M{"slug": slug}},
    {"$unwind": "$companyusers"},
    {"$match": bson.M{
        "companyusers.username": username,
    }},
}
err := c.Pipe(pipeline).All(&companyResults)

这为我提供了如下搜索结果:

[{ObjectIdHex("573aa0fddd731711c94830ca") MyCompany companyslug [] }]

没有检索到 CompanyUsers 中的任何数据。我该如何解决这个错误?

【问题讨论】:

    标签: mongodb go mgo


    【解决方案1】:

    尝试将companyResults 设为[]map[string]interface{} 而不是[]Company,看看你会得到什么样的结果。这有助于弄清楚companyResults 的结构应该是什么。

    var companyResults []map[string]interface{}
    

    你会看到类似的结果,

    [map[companyname:MyCompany slug:companyslug companyusers:map[username:username] _id:test]]
    

    看到companyusers 实际上是一个映射而不是一个数组。这是因为您使用了$unwind 阶段。它解构数组,为数组中的每个元素输出一个文档。见docs

    我同意 John Smith 的回答,即您根本不需要管道。但以下应该会给你想要的结果。

    type Result struct {
        Id           string `bson:"_id,omitempty"`
        CompanyName  string
        Slug         string
        CompanyUsers CompanyUser
    }
    
    var companyResults []Result
    

    【讨论】:

      【解决方案2】:

      我可能遗漏了一些东西,但你为什么需要 Pipe 呢?

      你可能会做得更容易:

      query := bson.M{"slug": slug, "companyusers.username": username}
      
      err := c.Find(query).All(&companyResults)
      

      我相当肯定这会给你同样的结果。

      但是,主要问题是您没有为 bson marshaller 提供字段名称。由于数据库中的字段是 companyusersusername,因此您必须将其告知编组器。

      type Company struct {
          Id              bson.ObjectId `bson:"_id,omitempty"`
          CompanyName     string
          Slug            string
          CompanyUsers    []CompanyUser `bson:"companyuser"`
      }
      type CompanyUser    struct {
          UserName    string `bson:"username"`
          Email       string
          FullName    string
      }
      

      您可能还想为其余字段修复此问题。

      【讨论】:

      • 是否需要添加bson marshaller?到目前为止,我能够在没有它们的情况下进行 mgo 查询。我已经写好的查询有没有危险的机会?
      • 在你的情况下可能不是,但我还是更愿意这样做。这不是额外的打字,但以后可能会有所帮助。
      猜你喜欢
      • 2015-10-02
      • 1970-01-01
      • 2021-07-29
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多