从 golang 中的 mongodb 中检索非结构化数组
Retrieve unstructured array from mongodb in golang
我在 MongoDB
中有以下文档
{
"_id" : ObjectId("57e4f8f454b9a4bb13a031d8"),
"ip" : "192.168.0.1",
"browser" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)",
"datetime" : ISODate("2016-09-23T09:42:12.821Z"),
"userhash" : "BF12742F1B3A486F75E80843230168CE",
"groups" : [
"group1",
"group2"
]
}
我正在尝试将这些组放入逗号分隔的字符串中,例如 group1,group2
,但尽管我已经尝试了很多次,但我总是遇到困难。
最接近的如下
type Record struct {
ID bson.ObjectId `bson:"_id"`
IP string `bson:"ip"`
Browser string `bson:"browser"`
DateTime string `bson:"datetime"`
Groups bson.M `bson:"groups,inline"`
}
result = []Record{}
_ = c.Find(bson.M{}).All(&result)
这似乎是将组放入映射中,但我无法将组放入字符串中。我是 Go 的新手,所以我仍在学习不同的数据类型以及使用什么语法来访问它们。
谢谢
您可以使用 Setter 来使用自定义解组方法,如下所示:
type Record struct {
//...
Groups Groups `bson:"groups"`
}
type Groups string
func (g *Groups) SetBSON(raw bson.Raw) error {
var data []string
err := raw.Unmarshal(&data)
*g = Groups(strings.Join(data, ","))
return err
}
groups
是MongoDB中的数组,所以在Go中使用切片类型:
type Record struct {
ID bson.ObjectId `bson:"_id"`
IP string `bson:"ip"`
Browser string `bson:"browser"`
DateTime string `bson:"datetime"`
Groups []string `bson:"groups"`
}
一旦你得到这样的记录:
err := c.Find(nil).All(&result)
// Do check error
您可以使用 strings.Join()
用逗号 ,
将它们连接起来。示例:
s := []string{"group1", "group2"}
all := strings.Join(s, ",")
fmt.Println(all)
上面的代码打印出来(在 Go Playground 上试试):
group1,group2
例如打印组:
for _, r := range result {
fmt.Println(strings.Join(r.Groups, ","))
}
我在 MongoDB
中有以下文档{
"_id" : ObjectId("57e4f8f454b9a4bb13a031d8"),
"ip" : "192.168.0.1",
"browser" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)",
"datetime" : ISODate("2016-09-23T09:42:12.821Z"),
"userhash" : "BF12742F1B3A486F75E80843230168CE",
"groups" : [
"group1",
"group2"
]
}
我正在尝试将这些组放入逗号分隔的字符串中,例如 group1,group2
,但尽管我已经尝试了很多次,但我总是遇到困难。
最接近的如下
type Record struct {
ID bson.ObjectId `bson:"_id"`
IP string `bson:"ip"`
Browser string `bson:"browser"`
DateTime string `bson:"datetime"`
Groups bson.M `bson:"groups,inline"`
}
result = []Record{}
_ = c.Find(bson.M{}).All(&result)
这似乎是将组放入映射中,但我无法将组放入字符串中。我是 Go 的新手,所以我仍在学习不同的数据类型以及使用什么语法来访问它们。
谢谢
您可以使用 Setter 来使用自定义解组方法,如下所示:
type Record struct {
//...
Groups Groups `bson:"groups"`
}
type Groups string
func (g *Groups) SetBSON(raw bson.Raw) error {
var data []string
err := raw.Unmarshal(&data)
*g = Groups(strings.Join(data, ","))
return err
}
groups
是MongoDB中的数组,所以在Go中使用切片类型:
type Record struct {
ID bson.ObjectId `bson:"_id"`
IP string `bson:"ip"`
Browser string `bson:"browser"`
DateTime string `bson:"datetime"`
Groups []string `bson:"groups"`
}
一旦你得到这样的记录:
err := c.Find(nil).All(&result)
// Do check error
您可以使用 strings.Join()
用逗号 ,
将它们连接起来。示例:
s := []string{"group1", "group2"}
all := strings.Join(s, ",")
fmt.Println(all)
上面的代码打印出来(在 Go Playground 上试试):
group1,group2
例如打印组:
for _, r := range result {
fmt.Println(strings.Join(r.Groups, ","))
}