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

Arj*_*ith 3 go mongodb mgo

我在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
}
Run Code Online (Sandbox Code Playgroud)

我需要检查具有给定"Slug"的"Company"中"CompanyUsers"下是否存在给定的"UserName".

Slug和UserName都由用户提供.

使用管道功能我成功完成了搜索,但返回的数据是空的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)
Run Code Online (Sandbox Code Playgroud)

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

[{ObjectIdHex("573aa0fddd731711c94830ca") MyCompany companyslug [] }]
Run Code Online (Sandbox Code Playgroud)

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

Aru*_*ath 5

尝试制作companyResults一个[]map[string]interface{}而不是一个[]Company,看看你得到了什么样的结果.这有助于弄清楚companyResults应该是什么结构.

var companyResults []map[string]interface{}
Run Code Online (Sandbox Code Playgroud)

你会看到一个结果,

[map[companyname:MyCompany slug:companyslug companyusers:map[username:username] _id:test]]
Run Code Online (Sandbox Code Playgroud)

看到这companyusers实际上是一个地图而不是一个数组.这是因为你对$unwind舞台的使用.它解构数组,为数组中的每个元素输出一个文档.查看文档.

我同意约翰史密斯的回答,你根本不需要管道.但是下面应该给你想要的结果.

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

var companyResults []Result
Run Code Online (Sandbox Code Playgroud)