使用 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 编组器提供字段名称。由于数据库中的字段是 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
}
您可能还想为其余字段修复该问题。
尝试将 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
我在 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 编组器提供字段名称。由于数据库中的字段是 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
}
您可能还想为其余字段修复该问题。
尝试将 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