我想通过_id
查找数据。我知道这些数据存在且存在_id
(我已经用pymongo对其进行了测试)。
但是下面的代码找不到它:
type id_cookie struct {
IdCookie int
}
func get_id_mongo() int {
session, err := mgo.Dial("127.0.0.1")
if err != nil {
panic(err)
}
defer session.Close()
// Optional. Switch the session to a monotonic behavior.
session.SetMode(mgo.Monotonic, true)
c := session.DB("id_bag").C("id_cookie")
data := id_cookie{}
err2 := c.FindId(bson.M{"_id": bson.ObjectIdHex("58593d1d6aace357b32bb3a1")}).One(&data)
if (err2 != nil){
Info.Println("error")
Info.Println(err2)
}
Info.Println(data)
return data.IdCookie
}
它只返回0
。
但我可以使用pytmongo和python找到它。
import requests
import pymongo
from pymongo import MongoClient
from bson.objectid import ObjectId
from pprint import pprint
client = MongoClient('127.0.0.1', 27017)
import base64
db = client.id_bag
pprint(db.collection_names())
result = db.id_cookie.insert_one(
{ 'IdCookie': 1
})
print(result.inserted_id)
data = db.id_cookie.find_one({"_id": ObjectId("58593d1d6aace357b32bb3a1")})
print(data)
结果如下:
['id_cookie', 'system.indexes']
58593d2d6aace357b32bb3a3
{'IdCookie': 1, '_id': ObjectId('58593d1d6aace357b32bb3a1')}
有没有人有任何想法?
编辑: 我尝试过:
err2 := c.FindId(bson.ObjectIdHex("58593d1d6aace357b32bb3a1")).One(&data)
但我仍然有0:
INFO: 2016/12/20 15:42:08 Cookie_Id.go:147: 1
INFO: 2016/12/20 15:42:08 Cookie_Id.go:149: 2
INFO: 2016/12/20 15:42:18 Cookie_Id.go:87: data
INFO: 2016/12/20 15:42:18 Cookie_Id.go:88: {0}
INFO: 2016/12/20 15:42:18 Cookie_Id.go:89: 0
INFO: 2016/12/20 15:42:18 Cookie_Id.go:118: 0
INFO: 2016/12/20 15:42:18 Cookie_Id.go:128: OK
答案 0 :(得分:15)
您使用Collection.FindId()
然后只传递了id值,或者使用了Collection.Find()
,然后您必须使用字段名称指定一个值:
err2 := c.FindId(bson.ObjectIdHex("58593d1d6aace357b32bb3a1")).One(&data)
// OR
err2 := c.Find(bson.M{"_id": bson.ObjectIdHex("58593d1d6aace357b32bb3a1")}).
One(&data)
如果没有错误,则表示找到了文档。
如果您始终看到0
已打印(作为id_cookie.IdCookie
字段的值),则表示持有此ID的文档中的字段具有不同的名称。
使用struct tags告诉它如何存储在MongoDB中。例如。如果在你的MongoDB中它被称为"myid"
,你可以像这样映射:
type id_cookie struct {
IdCookie int `bson:"myid"`
}
另请注意,每次要查询某些数据时都不应连接到MongoDB服务器,而是连接一次,只需重用会话即可。有关详细信息,请参阅:mgo - query performance seems consistently slow (500-650ms)