我的目标是实现这个 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/
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我主要使用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
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我想用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中编写命令行实用程序
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
如何使用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
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我正在阅读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方法
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳