如何在golang和mongodb中通过id找到

Nuw*_*ika 11 crud go mongodb

我需要使用ObjectIdHex获取值并进行更新并查看结果.我正在使用mongodb和golang.But以下代码无法按预期工作

package main

import (
    "fmt"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

type Person struct {
    Id      bson.ObjectId `json:"id" bson:"_id,omitempty"`
    Name  string
    Phone string
}

func checkError(err error) {
    if err != nil {
        panic(err)
    }
}

const (
    DB_NAME       = "gotest"
    DB_COLLECTION = "pepole_new1"
)

func main() {
    session, err := mgo.Dial("localhost")
    checkError(err)
    defer session.Close()

    session.SetMode(mgo.Monotonic, true)

    c := session.DB(DB_NAME).C(DB_COLLECTION)
    err = c.DropCollection()
    checkError(err)

    ale := Person{Name:"Ale", Phone:"555-5555"}
    cla := Person{Name:"Cla", Phone:"555-1234-2222"}
    kasaun := Person{Name:"kasaun", Phone:"533-12554-2222"}
    chamila := Person{Name:"chamila", Phone:"533-545-6784"}

    fmt.Println("Inserting")
    err = c.Insert(&ale, &cla, &kasaun, &chamila)
    checkError(err)

    fmt.Println("findbyID")
    var resultsID []Person
    //err = c.FindId(bson.ObjectIdHex("56bdd27ecfa93bfe3d35047d")).One(&resultsID)
    err = c.FindId(bson.M{"Id": bson.ObjectIdHex("56bdd27ecfa93bfe3d35047d")}).One(&resultsID)
    checkError(err)
    if err != nil {
        panic(err)
    }
    fmt.Println("Phone:", resultsID)



    fmt.Println("Queryingall")
    var results []Person
    err = c.Find(nil).All(&results)

    if err != nil {
        panic(err)
    }
    fmt.Println("Results All: ", results)


}
Run Code Online (Sandbox Code Playgroud)

FindId(bson.M{"Id": bson.ObjectIdHex("56bdd27ecfa93bfe3d35047d")}).One(&resultsID) 不适合我,并给我以下输出

Inserting
Queryingall
Results All:  [{ObjectIdHex("56bddee2cfa93bfe3d3504a1") Ale 555-5555} {ObjectIdHex("56bddee2cfa93bfe3d3504a2") Cla 555-1234-2222} {ObjectIdHex("56bddee2cfa93bfe3d3504a3") kasaun 533-12554-2222} {ObjectIdHex("56bddee2cfa93bfe3d3504a4") chamila 533-545-6784}]
findbyID
panic: not found

goroutine 1 [running]:
main.checkError(0x7f33d524b000, 0xc8200689b0)
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?我需要使用oid获取价值,并且还要更新我该怎么做

Kar*_*yan 16

使用 Golang 官方驱动也可以,如下:

// convert id string to ObjectId
objectId, err := primitive.ObjectIDFromHex("5b9223c86486b341ea76910c")
if err != nil{
    log.Println("Invalid id")
}

// find
result:= client.Database(database).Collection("user").FindOne(context.Background(), bson.M{"_id": objectId})
user := model.User{}
result.Decode(user)
Run Code Online (Sandbox Code Playgroud)

  • 这应该是更新后接受的答案。这次真是万分感谢 (3认同)

Ale*_*lex 13

它应该_id不是Id:

c.FindId(bson.M{"_id": bson.ObjectIdHex("56bdd27ecfa93bfe3d35047d")})
Run Code Online (Sandbox Code Playgroud)

  • 大卫布德沃思是对的.不要丢弃集合,也不要硬编码ID. (2认同)
  • 这个答案是错误的。您可以使用 [`Collection.FindId()`](https://godoc.org/gopkg.in/mgo.v2#Collection.FindId) 然后仅传递 id 值,或者使用 [`Collection.Find ()`](https://godoc.org/gopkg.in/mgo.v2#Collection.Find) 然后您也必须使用字段名称指定一个值。请参阅此答案:[使用 mgo 按 id 查找](/sf/ask/2887081711/#41244172)。 (2认同)
  • 这是一个错误的答案,因为 `ObjectIdHex()` 返回的类型是 `bson.ObjectId`,但实际上您需要将 `primitive.ObjectID` 类型传递给 mongo 过滤器。 (2认同)