如何在使用Golang的MongoDB中获取不同的值

huangapple go评论86阅读模式
英文:

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.

huangapple
  • 本文由 发表于 2014年10月31日 17:59:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/26671872.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定