以下是GoLang的MongoDB连接拨号.但它正在返回一个恐慌" 服务器返回SASL身份验证步骤错误:身份验证失败. " 我的用户名,密码,hostAddrs和dbName都是正确的.我在这里错过了什么?
dbName: = os.Getenv("ENV_DBNAME")
userName: = os.Getenv("ENV_DBUSER")
password: = os.Getenv("ENV_DBPASS")
dbHost: = os.Getenv("ENV_DBHOST")
mongoDialInfo: = & mgo.DialInfo {
Addrs: [] string {
dbHost
},
Database: dbName,
Username: userName,
Password: password,
Timeout: 60 * time.Second,
}
sess, err: = mgo.DialWithInfo(mongoDialInfo)
if (err != nil) {
panic(err)
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试安装mgo,这是一个用golang编写的mongo-driver.
标准命令:
go get launchpad.net/mgo
Run Code Online (Sandbox Code Playgroud)
但由于一些证书问题,它失败了.
所以我手动将mgo的源代码下载到本地E:\mgo
,但我不知道如何安装它.
文件树:
??.bzr
? ??branch
? ? ??lock
? ??branch-lock
? ??checkout
? ? ??lock
? ??repository
? ??indices
? ??lock
? ??obsolete_packs
? ??packs
? ??upload
??bson
??testdb
Run Code Online (Sandbox Code Playgroud)
我试过了:
cd mgo
go install
Run Code Online (Sandbox Code Playgroud)
它报告:
auth.go:34:2: import "launchpad.net/mgo/bson": cannot find package
Run Code Online (Sandbox Code Playgroud)
但是如果我首先尝试安装bson:
cd bson
go install
Run Code Online (Sandbox Code Playgroud)
它报告了另一个错误:
go install: no install location for _/E_/mgo/bson
Run Code Online (Sandbox Code Playgroud)
那么,安装它的正确命令是什么?
我目前正在使用带有mgo lib的mongodb进行Web应用程序,但我不确定我使用它的方式是不是很好..
package db
import (
"gopkg.in/mgo.v2"
)
const (
MongoServerAddr = "192.168.0.104"
RedisServerAddr = "192.168.0.104"
)
var (
MongoSession, err = mgo.Dial(MongoServerAddr)
MDB = MongoSession.DB("message")
MCol = MDB.C("new")
MSav = MDB.C("save")
UDB = MongoSession.DB("account")
UCol = UDB.C("user")
)
Run Code Online (Sandbox Code Playgroud)
我初始化db会话并创建获取集合和文档值的变量,因此当我需要查询集合时,我使用变量来创建它.
像那样 :
func UserExist(username string) bool {
user := Users{}
err := db.UCol.Find(bson.M{"username": username}).One(&user)
if err != nil {
return false
} else {
return true
}
}
Run Code Online (Sandbox Code Playgroud)
那么有最好的做法还是这个很好......?谢谢
根据文档(http://godoc.org/launchpad.net/mgo/v2)如果您使用的Upsert方法,你可以得到你的"Upserted"文件的ID.
还有一个不提供此功能的Insert方法.
这是为什么?如果我想执行Insert而不是Upsert怎么办?(或者永远不会有任何正当理由想要这样做?我开始怀疑.)
我对像Go这样的类型语言有点新,我正在努力学习实现事物的最佳方法.
我有两个结构代表将插入mongodb数据库的模型.一个结构(投资)将另一个结构(组)作为其字段之一.
type Group struct {
Base
Name string `json:"name" bson"name"`
}
type Investment struct {
Base
Symbol string `json:"symbol" bson:"symbol" binding:"required"`
Group Group `json:"group" bson:"group"`
Fields bson.M `json:"fields" bson:"fields"`
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,在投资模型中,不需要Group.如果没有组,我认为最好不要插入数据库.什么是在Go中处理这样的db模型的最佳方法?
这是我的结构定义:
type Article struct {
Id bson.ObjectId `json:"id" bson:"_id,omitempty"`
Title string `json:"title"`
Author string `json:"author"`
Date string `json:"date"`
Tags string `json:"tags"`
Content string `json:"content"`
Status string `json:"status"`
}
Run Code Online (Sandbox Code Playgroud)
这是我从数据库中获取数据的方法:
func AllArticles() []Article {
articles := []Article{}
err := c_articles.Find(bson.M{}).All(&articles)
if err != nil {
panic(err)
}
return articles
}
Run Code Online (Sandbox Code Playgroud)
这是存储在数据库中的一个对象:
{ "_id" : ObjectId( "5281b83afbb7f35cb62d0834" ),
"title" : "Hello1",
"author" : "DYZ",
"date" : "2013-11-10",
"tags" : "abc",
"content" : "This is another content.",
"status" : "published" }
Run Code Online (Sandbox Code Playgroud)
这是打印结果:
[{ObjectIdHex("") …
Run Code Online (Sandbox Code Playgroud) 在MongoDB中执行类似db.mycollection.find()
返回集合中所有文档的操作.
使用包labix.org/v2/mgo在GoLang工作时我做了例如:
query := db.C("client").Find();
Run Code Online (Sandbox Code Playgroud)
它抱怨它需要以界面的形式输入.我需要做的就是检索所有文档并迭代它们并显示每个文档.我该如何达到这个效果?我见过的所有例子似乎都有过滤器.
我是Go的新手.从我在mGo示例中看到的情况来看,为了查询集合然后从中读取,您必须预先定义将在结构中返回的数据.
type Person struct {
ID bson.ObjectId `bson:"_id,omitempty"`
Name string
Phone string
Timestamp time.Time
}
Run Code Online (Sandbox Code Playgroud)
在PHP中,文档被分配给一个数组.这是完美的,因为一个记录可能有完全不同的密钥集(可能不包含名称或电话,但包含电子邮件),我可以直接访问它而无需设置预定义的类/结构/变量.
有没有办法在Go/mGo中做同样的事情?
我有这个结构,匹配我正在使用的MongoDB集合的类型:
type AppInstance struct {
Id bson.ObjectId "_id,omitempty"
Url string
Priority int
LastSeen string
}
Run Code Online (Sandbox Code Playgroud)
我希望LastSeen字段能够保存上次与该特定应用程序交互的时间.因此,应用程序注册自己设置当前时间(作为字符串).
我想要的是Mongo在插入时动态设置自己当前的时间到该字段,就像MySQL的NOW()函数一样.
我有这个辅助功能:
func mongoNow() bson.JavaScript {
return bson.JavaScript{Code:
"return (new Date()).ISODate('YYYY-MM-DD hh:mm:ss');"}
}
Run Code Online (Sandbox Code Playgroud)
我试过这个:
c := mongoSession.DB("myapp").C("instances")
rand.Seed(time.Now().UnixNano())
err := c.Insert(
struct{Id, Serial, Priority, Url, LastSeen interface{}}{
Id: bson.NewObjectId(),
Url: getInformedHost() + ":" + getRunningPortString(),
Priority: rand.Int(),
LastSeen: mongoNow() }
)
checkError(err, "Could not register on MongoDB server.", 3)
Run Code Online (Sandbox Code Playgroud)
LastSeen字段存储为脚本而不是评估:
[_id] => MongoId Object (
[$id] => 502d6f984eaead30a134fa10
)
[id] => MongoId Object ( …
Run Code Online (Sandbox Code Playgroud) 我正在尝试从一个大量嵌套的go结构构建一个mongo文档,而且我遇到了从go结构转换为mongo对象的问题.我已经构建了一个非常简化的版本,我正在尝试使用它:http://play.golang.org/p/yPZW88deOa
package main
import (
"os"
"fmt"
"encoding/json"
)
type Square struct {
Length int
Width int
}
type Cube struct {
Square
Depth int
}
func main() {
c := new(Cube)
c.Length = 2
c.Width = 3
c.Depth = 4
b, err := json.Marshal(c)
if err != nil {
panic(err)
}
fmt.Println(c)
os.Stdout.Write(b)
}
Run Code Online (Sandbox Code Playgroud)
运行此命令会产生以下输出:
&{{2 3} 4}
{"Length":2,"Width":3,"Depth":4}
Run Code Online (Sandbox Code Playgroud)
这完全有道理.似乎Write函数或json.Marshal函数都有一些功能可以折叠嵌套结构,但是当我尝试使用mgo函数将这些数据插入mongo数据库时,我的问题出现了func (*Collection) Upsert
(http://godoc.org/labix .org/v2/mgo#Collection.Upsert).如果我json.Marshal()
首先使用该函数并将字节传递给collection.Upsert()
它,它将存储为二进制文件,这是我不想要的,但如果我使用collection.Upsert(bson.M("_id": id, &c) …