我在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中的任何数据.我该如何解决这个错误?
尝试制作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)
| 归档时间: |
|
| 查看次数: |
661 次 |
| 最近记录: |