问题 通过mgo找到id


我想通过找到一个数据 _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

1247
2017-12-20 13:56


起源



答案:


你要么使用 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 field),这意味着持有此id的文档中的字段具有不同的名称。

使用 struct标签 告诉它如何存储在MongoDB中。例如。如果在你的MongoDB中它被调用 "myid",你可以像这样映射:

type id_cookie struct {
    IdCookie int `bson:"myid"`
}

另请注意,每次要查询某些数据时都不应连接到MongoDB服务器,而是连接一次,只需重用会话即可。详情见: mgo - 查询性能似乎一直很慢(500-650ms)


13
2017-12-20 14:04



感谢您的注意,但IdCookie不是_id - user462794
@ user462794请参阅编辑的答案。如果你使用 FindId(),你只需要传递id值(而不是包含在 bson.M)。或者使用 Find() 然后你可以传递包裹的id bson.M。 - icza
我还有0:INFO:2016/12/20 15:42:08 Cookie_Id.go:147:1信息:2016/12/20 15:42:08 Cookie_Id.go:149:2信息: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信息:2016/12/20 15:42:18 Cookie_Id.go:118:0信息:2016/12/20 15:42:18 Cookie_Id.go:128:好的 - user462794
@ user462794我发布的代码有效(已验证)。必须有一些你没有向我们展示的东西,而且是不同的。 - icza
它是:IdCookie int bson:"IdCookie" 非常感谢 - user462794


答案:


你要么使用 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 field),这意味着持有此id的文档中的字段具有不同的名称。

使用 struct标签 告诉它如何存储在MongoDB中。例如。如果在你的MongoDB中它被调用 "myid",你可以像这样映射:

type id_cookie struct {
    IdCookie int `bson:"myid"`
}

另请注意,每次要查询某些数据时都不应连接到MongoDB服务器,而是连接一次,只需重用会话即可。详情见: mgo - 查询性能似乎一直很慢(500-650ms)


13
2017-12-20 14:04



感谢您的注意,但IdCookie不是_id - user462794
@ user462794请参阅编辑的答案。如果你使用 FindId(),你只需要传递id值(而不是包含在 bson.M)。或者使用 Find() 然后你可以传递包裹的id bson.M。 - icza
我还有0:INFO:2016/12/20 15:42:08 Cookie_Id.go:147:1信息:2016/12/20 15:42:08 Cookie_Id.go:149:2信息: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信息:2016/12/20 15:42:18 Cookie_Id.go:118:0信息:2016/12/20 15:42:18 Cookie_Id.go:128:好的 - user462794
@ user462794我发布的代码有效(已验证)。必须有一些你没有向我们展示的东西,而且是不同的。 - icza
它是:IdCookie int bson:"IdCookie" 非常感谢 - user462794