我的目标是实现此code。除了使用sql而不是我想使用mongoDB。我认为处理会话的方式存在问题。
我尝试使用mgo通过Rest API将一些用户数据插入到MongoDB中。每当我打开mongo shell并运行show dbs
命令时,都不会显示poll
DB。我使用Postman来测试Rest API。任何想法在插入过程中我可能做错了什么?我尝试先在mongo shell中创建集合,然后运行CreateUser
函数,但我仍然没有看到poll
数据库被创建。
用户
type User struct {
Id bson.ObjectId `json:"id" bson:"_id,omitempty"`
Username string `json:"username"`
Password string `json:"password"`
Email string `json:"email"`
}
UserDAO的
type UserDAO struct {
session *mgo.Session
}
创建会话
func GetMongoSession() *mgo.Session {
if mgoSession == nil {
var err error
mgoSession, err = mgo.Dial("localhost")
mgoSession.SetMode(mgo.Monotonic, true)
if err != nil {
log.Fatal("Failed to start the Mongo session.")
}
}
return mgoSession.Clone()
}
我将User结构传递给我使用Postman创建的CreateUser
函数:
{
"username":"uname",
"password":"pass",
"email":"test@mail.com"
}
然后我只回应相同的结构并接收此输出:
{
"id": "",
"username": "uname",
"password": "pass",
"email": "test@mail.com"
}
创建用户
func (dao *UserDAO) CreateUser(u *User) (*User, error) {
//return errors.New("Not implemented")
// Get "users" collection
dao.session = GetMongoSession()
c := dao.session.DB("poll").C("user")
defer dao.session.Close()
//u.Id = bson.NewObjectId()
err := c.Insert(u)
if err != nil {
return nil, err
}
return u, nil
}
Http处理函数
func (h *Handler) CreateUserReq(w http.ResponseWriter, r *http.Request) {
// create new user using information from the Request object
var user User
decoder := json.NewDecoder(r.Body)
if err := decoder.Decode(&user); err != nil {
panic(err)
}
defer r.Body.Close()
// Create new User
u, err := h.UserService.CreateUser(&user)
if err != nil {
panic(err)
}
json.NewEncoder(w).Encode(*u)
}
show dbs的输出
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
答案 0 :(得分:2)
因为,我没有完整的应用程序上下文,因此无法诊断代码的确切问题。但是我提出了一个很好的例子,它按预期工作。
请参阅以下代码。
package main
import (
"gopkg.in/mgo.v2"
"log"
"gopkg.in/mgo.v2/bson"
)
type User struct {
Id bson.ObjectId `json:"id" bson:"_id,omitempty"`
Username string `json:"username"`
Password string `json:"password"`
Email string `json:"email"`
}
func GetMongoSession() *mgo.Session {
mgoSession, err := mgo.Dial("localhost")
mgoSession.SetMode(mgo.Monotonic, true)
if err != nil {
log.Fatal("Failed to start the Mongo session.")
}
return mgoSession.Clone()
}
func CreateUser(u *User) (*User, error) {
session := GetMongoSession()
c := session.DB("poll").C("user")
defer session.Close()
err := c.Insert(u)
if err != nil {
return nil, err
}
return u, nil
}
func main() {
var user = User{
Email: "abc@somewhere.come",
Password: "My-secret",
Username: "YouGuess",
}
_, e := CreateUser(&user)
if e != nil {
panic(e)
}
log.Println("Done...")
}
执行后,如果您使用正确的凭据成功建立连接,则应该在MongoDB中看到一个文档。
我可以在我的收藏中看到以下文件:
{
"_id": ObjectId("5a80941de0a0f75123aeb435"),
"username": "YouGuess",
"password": "My-secret",
"email": "abc@somewhere.come"
}
答案 1 :(得分:0)
尝试下面的代码,首先我检查我的用户结构包含来自postman的数据,然后当你将会话public class CatalogItem
: Entity
{
private string _name;
protected CatalogItem() { }
public CatalogItem(string name)
{
_name = name;
}
}
分配给非指针*mgo.Session
变量时也会出现一个错误。所以我已经改变了很多东西,并且它可以很好地创建具有dao.session
名称的数据库并使用新文档创建用户集合,我也从User结构中删除了ObjectId。看看
poll
我的收藏输出是: -
package main
import (
"encoding/json"
"gopkg.in/mgo.v2"
"log"
// "gopkg.in/mgo.v2/bson"
)
var (
mgoSession *mgo.Session
)
type UserDAO struct{
session *mgo.Session
}
type User struct {
Username string `json:"username"`
Password string `json:"password"`
Email string `json:"email"`
}
func GetMongoSession() *mgo.Session {
if mgoSession == nil {
var err error
mgoSession, err = mgo.Dial("localhost")
mgoSession.SetMode(mgo.Monotonic, true)
if err != nil {
log.Fatal("Failed to start the Mongo session.")
}
}
return mgoSession.Clone()
}
func (dao *UserDAO) CreateUser(u *User) (*User, error) {
//return errors.New("Not implemented")
// Get "users" collection
session := GetMongoSession()
// log.Println(session)
c := session.DB("poll").C("user")
defer session.Close()
//u.Id = bson.NewObjectId()
err := c.Insert(u)
if err != nil {
return nil, err
}
return u, nil
}
func main(){
// this data will come from postman in your case
jsonStr := []byte(`{
"username":"uname",
"password":"pass",
"email":"test@mail.com"
}
`)
var user User
err := json.Unmarshal(jsonStr, &user)
if err != nil{
log.Println(err)
}
var dao *UserDAO
dao.CreateUser(&user)
}
您不需要为新文档创建对象ID,它将在插入新文档时自行创建。另外如果你想要top,只需使用golang创建一个集合,然后插入数据就可以显式创建它。完成此功能create collection