2016-02-12 8 views
7

Ich brauche Werte mit ObjectIdHex erhalten und aktualisieren und auch das Ergebnis anzeigen. Ich verwende mongodb und golang.But folgenden Code funktioniert nicht wie erwartetSo finden Sie mit ID in Golang und 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) nicht für mich arbeiten und das Geben mir zu folgen Ausgabe

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) 

Wie kann ich dieses Problem beheben? Ich brauche bekommen Wert mit oid und auch aktualisiere, wie kann ich das tun

+4

Sie die Datensätze löschen, Wiedereinsetzen sie dann eine hart codierte ID verwenden. Wenn Sie einen Datensatz einfügen, wird ihm eine zufällige ID zugewiesen. Es wird bei jedem Lauf anders sein. Ihre hardcoded ID kann nicht funktionieren –

Antwort

9

Es sollte _id nicht Id:

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

Ich bekomme das gleiche Ergebnis und Fehler .. –

+2

David Budworth hat Recht. Lassen Sie die Sammlung nicht fallen oder codieren Sie keine IDs. –

+0

Diese Antwort ist falsch. Sie verwenden entweder ['Collection.FindId()'] (https://godoc.org/gopkg.in/mgo.v2#Collection.FindId) und übergeben dann nur den ID-Wert oder Sie verwenden ['Collection.Find() '] (https://godoc.org/gopkg.in/mgo.v2#Collection.Find) und dann müssen Sie auch einen Wert mit dem Feldnamen angeben. Siehe diese Antwort: [Suche nach ID mit mgo] (https://stackoverflow.com/questions/41244024/find-by-id-with-mgo/41244172#41244172). – icza