2016-12-20 95 views
8

我想通過_id找到數據。我知道這個數據存在,並且這個_id存在(我用pymongo測試過它)。通過ID搜索mgo

但下面的代碼沒有找到它:

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 

回答

7

你要麼使用Collection.FindId()然後傳遞值只有ID,或者你使用​​然後你必須指定一個字段名稱的值:

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)

+0

謝謝你的筆記,但IdCookie不_id – user462794

+0

@ user462794請參閱編輯答案。如果你使用'FindId()',你只需要傳遞id值(不包含在'bson.M'中)。或者使用'Find()',然後你可以傳遞包裹在'bson.M'中的id。 – icza

+0

我仍然有0:INFO:二零一六年十二月二十零日15時42分08秒Cookie_Id.go:147:1 INFO:二零一六年十二月二十零日15時42分08秒Cookie_Id.go:149:2 INFO:2016/12/20 15:42:18 Cookie_Id.go:87:數據 信息:2016/12/20 15:42:18 Cookie_Id.go:88:{0} 信息:2016/12/20 15:42:18 Cookie_Id.go:89:0 INFO:二零一六年十二月二十零日15時42分18秒Cookie_Id.go:118:0 INFO:二零一六年十二月二十零日15時42分18秒Cookie_Id.go:128:OK – user462794