英文:
how to get distinct values in mongodb using golang
问题
我尝试使用唯一标识从我的集合中检索文档。
我有一个包含字段:name、age、city和rank的集合。我想使用golang从mongodb中获取“city”结果。
我的结构体代码如下:
type exp struct {
name string `bson:"name"`
age int `bson:"age"`
city string `bson:"city"`
rank int `bson:"rank"`
}
使用以下代码从mongodb中检索结果:
var result []exp //我的结构体类型
err = coll.Find(bson.M{"city": bson.M{}}).Distinct("city", &result)
fmt.Println(result)
使用这段代码,我得到一个空数组作为结果。如何获取所有的城市?
英文:
I tried to retrieve a document from my collection with unique id.
I have a collection with fields: name, age, city, and rank. I want to get 'city' results from mongodb using golang.
My struct code
type exp struct {
name string `bson:"name"`
age int `bson:"age"`
city string `bson:"city"`
rank int `bson:"rank"`
}
With the following code to retrieve results from mongodb:
var result []exp //my struct type
err = coll.Find(bson.M{"City":bson.M{}}).Distinct("City",&result)
fmt.Println(result)
With this code I get an empty array as the result. How would I get all the cities?
答案1
得分: 9
请尝试以下代码:
var result []string
err = c.Find(nil).Distinct("city", &result)
if err != nil {
log.Fatal(err)
}
fmt.Println(result)
这段代码是使用Go语言编写的,它的功能是从数据库中获取不重复的城市名称,并将结果打印输出。
英文:
Try this code
var result []string
err = c.Find(nil).Distinct("city", &result)
if err != nil {
log.Fatal(err)
}
fmt.Println(result)
答案2
得分: 1
由于反射的限制,mgo
(以及encoding/json
和其他类似的包)无法使用未导出的字段来编组或解组数据。您需要做的是通过将首字母大写来导出您的字段:
type exp struct {
Name string `bson:"name"`
Age int `bson:"age"`
City string `bson:"city"`
Rank int `bson:"rank"`
}
另外需要注意的是,如果所需的名称与小写字段名相同,则不需要指定bson标签。bson
的**文档**中指出:
小写字段名用作每个导出字段的键,但可以使用相应的字段标签更改此行为。
编辑:
我刚意识到您实际上得到的是一个_空切片_,而不是一个具有空结构字段的切片。所以我的回答并不是对您的问题的实际回答,但这仍然是您需要考虑的一个问题。
英文:
Due to restrictions in reflection, mgo
(as well as encoding/json
and other similar packages) is unable to use unexported fields to marshal or unmarshal data. What you need to do is to export your fields by capitalize the first letter:
type exp struct {
Name string `bson:"name"`
Age int `bson:"age"`
City string `bson:"city"`
Rank int `bson:"rank"`
}
A side note: you do not need to specify the bson tags if the desired name is the same as the lowercase field name. The documentation for bson
states:
> The lowercased field name is used as the key for each exported field,
> but this behavior may be changed using the respective field tag.
Edit:
I just realized you did get an empty slice and not a slice with empty struct fields. My answer is then not an actual answer to the question, but it is still an issue that you need to consider.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论