2016-02-12 30 views
7

Potrzebuję uzyskać wartości przy użyciu ObjectIdHex i zrobić aktualizację, a także wyświetlić wynik. Używam MongoDB i golang.But Poniższy kod nie działa zgodnie z oczekiwaniamiJak znaleźć przez id w golang i mongodb

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) 


} 

FindId(bson.M{"Id": bson.ObjectIdHex("56bdd27ecfa93bfe3d35047d")}).One(&resultsID) nie działa dla mnie i daje mi następujący wynik

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) 

Jak mogę rozwiązać ten problem? Potrzebuję uzyskać wartość używając oid i aktualizują także w jaki sposób można to zrobić

+4

usuwasz zapisy, ponownie wkładając je następnie za pomocą zakodowanego id. Po wstawieniu rekordu otrzymuje on losowy identyfikator. Będzie inaczej w każdym biegu. Twój hardcoded id nie działa –

Odpowiedz

9

Należy _id nie Id:

c.FindId(bson.M{"_id": bson.ObjectIdHex("56bdd27ecfa93bfe3d35047d")}) 
+1

Otrzymuję ten sam wynik i błąd. –

+2

David Budworth ma rację. Nie upuszczaj kolekcji ani nie koduj identyfikatorów. –

+0

Ta odpowiedź jest błędna. Używasz ['Collection.FindId()'] (https://godoc.org/gopkg.in/mgo.v2#Collection.FindId), a następnie przekazujesz tylko wartość id, lub używasz ['Collection.Find() '] (https://godoc.org/gopkg.in/mgo.v2#Collection.Find), a następnie musisz podać wartość z nazwą pola. Zobacz tę odpowiedź: [Znajdź po id z mgo] (https://stackoverflow.com/questions/41244024/find-by-id-with-mgo/41244172#41244172). – icza