2016-12-20 7 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')} 

Кто-нибудь есть какие-либо идеи?

Edit: я уже попробовать с:

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(), а затем передается только значение идентификатора, или вы используете 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), это означает, что поле в документе, имеющем этот идентификатор, имеет другое имя.

Используйте 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()', а затем вы можете передать id, завернутый в 'bson.M'. – icza

+0

У меня все еще есть 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: данные 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 – user462794