2016-02-12 10 views
7

Ho bisogno di ottenere valori usando ObjectIdHex e di aggiornare e anche visualizzare il risultato. Sto usando MongoDB e golang.But seguente codice non funziona come previstoCome trovarlo con id in golang e 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) non ha funzionato per me e per avermi dato seguente output

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) 

come posso risolvere questo problema? ho bisogno di ottenere valore con OID e non aggiorna inoltre come posso farlo

+4

si eliminano i record, reinserirli quindi utilizzando un id hard coded. Quando inserisci un record, viene assegnato un ID casuale. Sarà diverso ogni volta. Il tuo ID hardcoded non può funzionare –

risposta

9

Dovrebbe essere _id non Id:

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

sto ottenendo lo stesso risultato e l'errore .. –

+2

David Budworth ha ragione. Non lasciare la raccolta, o non ids hardcode. –

+0

Questa risposta è sbagliata. O usi ['Collection.FindId()'] (https://godoc.org/gopkg.in/mgo.v2#Collection.FindId) e poi passi solo il valore id, o usi ['Collection.Find() '] (https://godoc.org/gopkg.in/mgo.v2#Collection.Find) e quindi è necessario specificare un valore anche con il nome del campo. Vedi questa risposta: [Trova per id con mgo] (https://stackoverflow.com/questions/41244024/find-by-id-with-mgo/41244172#41244172). – icza