Mgo insert命令不创建数据库或插入文档

时间:2018-02-11 17:23:14

标签: mongodb go mgo

我的目标是实现此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

2 个答案:

答案 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