草庐IT

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

coder 2024-07-05 原文

我的目标是实现这个 code .除了不使用 sql,我想使用 mongoDB。我认为我处理 session 的方式存在问题。

我正在尝试使用 mgo 通过 Rest API 将一些用户数据插入到 MongoDB 中。每当我打开 mongo shell 并运行 show dbs 命令时,都不会显示 poll DB。我正在使用 Postman 来测试 Rest API。任何想法我在插入过程中可能做错了什么?我尝试先在 mongo shell 中创建集合,然后运行 ​​CreateUser 函数,但我仍然没有看到创建了 poll DB。

用户

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
}

创建 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()
}

我将一个用户结构传递到我使用 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
admin   0.000GB
config  0.000GB
local   0.000GB

最佳答案

因为我没有您的应用程序的完整上下文,所以无法诊断您的代码到底有什么问题。但我想出了一个接近的例子,它按预期工作。

请看下面的代码。

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"
}

关于mongodb - Mgo 插入命令不创建数据库或插入文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48734250/

有关mongodb - Mgo 插入命令不创建数据库或插入文档的更多相关文章

  1. ruby - 如何在 Ruby 中顺序创建 PI - 2

    出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  5. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  6. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  7. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  8. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  9. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  10. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

随机推荐