猿问

使用 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

}

我需要检查具有给定“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 中的任何数据。我该如何解决这个错误?


慕侠2389804
浏览 139回答 2
2回答

红糖糍粑

尝试制作companyResultsa[]map[string]interface{}而不是 a[]Company以查看您得到的结果。这有助于弄清楚companyResults应该是什么结构。var companyResults []map[string]interface{}你会看到这样的结果,[map[companyname:MyCompany slug:companyslug companyusers:map[username:username] _id:test]]看到这companyusers实际上是一个地图而不是一个数组。这是因为你对$unwind舞台的使用。它解构数组,为数组中的每个元素输出一个文档。请参阅文档。我同意约翰史密斯的回答,你根本不需要管道。但以下应该会给你想要的结果。type Result struct {    Id           string `bson:"_id,omitempty"`    CompanyName  string    Slug         string    CompanyUsers CompanyUser}var companyResults []Result

阿晨1998

我可能遗漏了一些东西,但你为什么需要Pipe这个?您可能可以更轻松地做到这一点:query := bson.M{"slug": slug, "companyusers.username": username}err := c.Find(query).All(&companyResults)我相当肯定这会给你同样的结果。但是,主要问题是您没有给 bson marshaller 字段名称。由于数据库中的字段是companyusers并且username您必须将其告知编组器。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}您可能还想为其他字段修复该问题。
随时随地看视频慕课网APP

相关分类

Go
我要回答