分享
mgo-后续测试(指定字段,获取id)
forrestsun · · 8150 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
测试完mgo中的DBRef后,想接着测试指定字段的显示,才发现原来采用框架编码,很多问题被隐藏了起来:
1.显示指定字段:
之前在使用mgo时一直是查询全部字段,在mongo终端环境写为如下格式:
> db.logs.find({},{"log":1}) { "_id" : "3a06384a40a8e587806f194c6c80253e", "log" : "这是一个测试日志" } { "_id" : "36bb718040a4362b8035ebd822125dba", "log" : "这是一个测试日志" }
为了保证只显示log内容,需要去掉id显示,则写成这样
> db.logs.find({},{"_id":0,"log":1}) { "log" : "这是一个测试日志" } { "log" : "这是一个测试日志" }
在golang中的mgo写法却需要借助mgo中的select()方法实现,代码如下:
err = d.Find(bson.M{}).Select(bson.M{"log": 1}).All(&result1)
结果如下:
[ `run` | done: 342.828631ms ] [{b5e57fed409eab8e804e17088b1fdaae 这是一个测试日志 { <nil> } 0001-01-01 00:00:00 +0000 UTC} {261e7fe9402c6842807092e7f0df61ce 这是一个测试日志 { <nil> } 0001-01-01 00:00:00 +0000 UTC}
去掉id显示:
err = d.Find(bson.M{}).Select(bson.M{"log": 1, "_id": 0}).All(&result1)
结果
{ 这是一个测试日志 { <nil> } 0001-01-01 00:00:00 +0000 UTC}
{ 这是一个测试日志 { <nil> } 0001-01-01 00:00:00 +0000 UTC}
嗯.....如果想只显示一个字段,我现在的办法是进行循环输出.
for i := 0; i < len(result1); i++ {
fmt.Println(result1[i].Log)
}
2.查询ID的值:
在mongo终端很简单:
> db.logs.find({},{"_id":1}) { "_id" : "3a06384a40a8e587806f194c6c80253e" } { "_id" : "36bb718040a4362b8035ebd822125dba" }
在mgo下却查不出来?问题在struct中
//错误写法
type Log struct {
LogId string
Log string
LogUser mgo.DBRef
Inserted time.Time
}
//正确写法
type Log struct {
LogId string `bson:"_id"`
Log string
LogUser mgo.DBRef
Inserted time.Time
}
再查询ID没有问题了:),注意查的时间是查"_id"而不是logid
err = d.Find(bson.M{}).Select(bson.M{"_id": 1}).All(&result1)
结果:
{32197b67400e229f8017fd8258c2f700 { <nil> } 0001-01-01 00:00:00 +0000 UTC}
{e7dda7b34052584280ef55f49b16eb2c { <nil> } 0001-01-01 00:00:00 +0000 UTC}
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信8150 次点击
下一篇:gocrawl 分析
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
测试完mgo中的DBRef后,想接着测试指定字段的显示,才发现原来采用框架编码,很多问题被隐藏了起来:
1.显示指定字段:
之前在使用mgo时一直是查询全部字段,在mongo终端环境写为如下格式:
> db.logs.find({},{"log":1}) { "_id" : "3a06384a40a8e587806f194c6c80253e", "log" : "这是一个测试日志" } { "_id" : "36bb718040a4362b8035ebd822125dba", "log" : "这是一个测试日志" }
为了保证只显示log内容,需要去掉id显示,则写成这样
> db.logs.find({},{"_id":0,"log":1}) { "log" : "这是一个测试日志" } { "log" : "这是一个测试日志" }
在golang中的mgo写法却需要借助mgo中的select()方法实现,代码如下:
err = d.Find(bson.M{}).Select(bson.M{"log": 1}).All(&result1)
结果如下:
[ `run` | done: 342.828631ms ] [{b5e57fed409eab8e804e17088b1fdaae 这是一个测试日志 { <nil> } 0001-01-01 00:00:00 +0000 UTC} {261e7fe9402c6842807092e7f0df61ce 这是一个测试日志 { <nil> } 0001-01-01 00:00:00 +0000 UTC}
去掉id显示:
err = d.Find(bson.M{}).Select(bson.M{"log": 1, "_id": 0}).All(&result1)
结果
{ 这是一个测试日志 { <nil> } 0001-01-01 00:00:00 +0000 UTC}
{ 这是一个测试日志 { <nil> } 0001-01-01 00:00:00 +0000 UTC}
嗯.....如果想只显示一个字段,我现在的办法是进行循环输出.
for i := 0; i < len(result1); i++ {
fmt.Println(result1[i].Log)
}
2.查询ID的值:
在mongo终端很简单:
> db.logs.find({},{"_id":1}) { "_id" : "3a06384a40a8e587806f194c6c80253e" } { "_id" : "36bb718040a4362b8035ebd822125dba" }
在mgo下却查不出来?问题在struct中
//错误写法
type Log struct {
LogId string
Log string
LogUser mgo.DBRef
Inserted time.Time
}
//正确写法
type Log struct {
LogId string `bson:"_id"`
Log string
LogUser mgo.DBRef
Inserted time.Time
}
再查询ID没有问题了:),注意查的时间是查"_id"而不是logid
err = d.Find(bson.M{}).Select(bson.M{"_id": 1}).All(&result1)
结果:
{32197b67400e229f8017fd8258c2f700 { <nil> } 0001-01-01 00:00:00 +0000 UTC}
{e7dda7b34052584280ef55f49b16eb2c { <nil> } 0001-01-01 00:00:00 +0000 UTC}