使用 mgo 管道功能时未完全检索数据

Data not fully retrieved while using mgo pipe function

我在 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
}

我需要检查给定的 "UserName" 是否存在于具有给定的 "Slug".

的 "Company" 中的 "CompanyUsers" 下

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 [] }]

None 的 CompanyUsers 数据被检索。我该如何解决这个错误?

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

你可能会做得更简单:

query := bson.M{"slug": slug, "companyusers.username": username}

err := c.Find(query).All(&companyResults)

我很确定这会给你相同的结果。

但是,主要问题是您没有为 bson 编组器提供字段名称。由于数据库中的字段是 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
}

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

尝试将 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