英文:
How to save struct based type with a map property into mongodb
问题
我想将MongoDB用作会话存储,并将基于结构的数据类型保存到MongoDB中。
结构类型如下:
type Session struct {
Id string
Data map[string]interface{}
}
创建对Session结构类型的引用,并将一些数据放入属性中,例如:
type Authen struct {
Name, Email string
}
a := &Authen{Name: "Foo", Email: "foo@example.com"}
s := &Session{}
s.Id = "555555"
s.Data["logged"] = a
如何将会话数据s
保存到MongoDB中,并如何查询这些数据并再次保存到引用中?
我认为问题可能出现在类型为map[string]interface{}
的数据属性上。
作为MongoDB的驱动程序,我将使用mgo。
英文:
I want to use mongodb as session storage and save a struct based data type into mongodb.
The struct type looks like:
type Session struct {
Id string
Data map[string]interface{}
}
And create reference to Session struct type and put some data into properties like:
type Authen struct {
Name, Email string
}
a := &Authen{Name: "Foo", Email: "foo@example.com"}
s := &Session{}
s.Id = "555555"
s.Data["logged"] = a
How to save the session data s
into mongodb and how to query those data back and save into a reference again?
I think the problem can occurs with the data property of type map[string]interface{}
.
As driver to mongodb I would use mgo
答案1
得分: 5
对于插入操作,没有什么特殊的要做。只需像通常一样将会话值插入数据库,地图类型将被正确插入:
err := collection.Insert(&session)
假设描述的结构,这将在数据库中插入以下文档:
{
"id": "555555",
"data": {
"logged": {
"name": "foo",
"email": "foo@example.com"
}
}
}
然而,你不能像那样轻松地查询它,因为 map[string]interface{}
无法给 bson 包提供关于值类型的良好提示(它将最终成为一个地图,而不是 Authen
)。为了解决这个问题,你需要在 Data
字段所使用的类型中实现 bson.Setter 接口。
英文:
There's nothing special to be done for inserts. Just insert that session value into the database as usual, and the map type will be properly inserted:
err := collection.Insert(&session)
Assuming the structure described, this will insert the following document into the database:
{id: "555555", data: {logged: {name: "foo", email: "foo@example.com"}}}
You cannot easily query it back like that, though, because the map[string]interface{}
does not give the bson package a good hint about what the value type is (it'll end up as a map, instead of Authen
). To workaround this, you'd need to implement the bson.Setter interface in the type used by the Data
field.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论