【问题标题】:Find by id with mgo使用 mgo 按 id 查找
【发布时间】:2017-05-05 18:28:50
【问题描述】:

我想查找_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

【问题讨论】:

    标签: mongodb go mgo


    【解决方案1】:

    您要么使用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)

    【讨论】:

    • 感谢您的注意,但 IdCookie 不是 _id
    • @user462794 请查看编辑后的答案。如果您使用FindId(),您只需传递 id 值(而不是包裹在bson.M 中)。或者使用Find(),然后你可以传递包裹在bson.M中的id。
    • 我还有 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 信息: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 信息:2016/12/20 15:42:18 Cookie_Id.go:118:0 信息:2016/12/20 15:42:18 Cookie_Id.go:128:好的跨度>
    • @user462794 我发布的代码有效(已验证)。一定有其他东西你没有向我们展示过并且是不同的。
    • 它是:IdCookie int bson:"IdCookie" 非常感谢
    猜你喜欢
    • 1970-01-01
    • 2019-05-28
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 2015-09-04
    • 2013-11-21
    相关资源
    最近更新 更多