2017-12-20 5 views
1

Ich versuche, ein Objekt in einem Array eines Dokuments mit Mgo zu aktualisieren. Die Objektstruktur ist wie folgt:Warum aktualisiert meine Abfrage das Objekt in einem Array nicht?

{ 
"_id": 2, 
"status": 0, 
"details": [{ 
    "id": 2, 
    "category": "A", 
    "obj": { 
     "apple": 5, 
     "banana": 2, 
     "cherry": 10 
    }, 
    "members": [{ 
      "id": 3, 
      "category": "A", 
      "obj": { 
       "apple": 5, 
       "banana": 2, 
       "cherry": 10 
      } 
     }, 
     { 
      "id": 4, 
      "category": "A", 
      "obj": { 
       "apple": 5, 
       "banana": 2, 
       "cherry": 10 
      } 
     } 
    ] 
}] 
} 

Query1: ich zum ersten Mal versuchen details > obj zu aktualisieren, wo "guava": 15 ein weiteres Attribut hinzufügen versuchen, die folgende Abfrage mit

cond := bson.M{ "$and": []bson.M{ bson.M{"document.details":bson.M{ "$elemMatch": bson.M{ "category": "A"} } }, bson.M{"document.status":0} } } 
query := bson.M{ "$set": bson.M{ "document.details.$.obj.guava":15 } } 
_, err := models.DbUpdateAll(Collection, cond, query) 

Diese Abfrage wird weder eine Erzeugung Fehler noch das Dokument zu aktualisieren. Kann jemand bitte sagen, wie kann ich es erreichen

Hinweis: Ich habe über Google gesucht, konnte aber nicht relevant finden, was ich brauche.

Query2: Ich brauche auch die details > members > obj die gleiche Art und Weise zu aktualisieren, die ich für details > obj zu tun versuchen. Bitte sagen Sie mir auch, wie ich das gleiche für details > members > obj erreichen kann.

Ich habe Stunden damit verbracht, herauszufinden, aber nichts hat geklappt. Ich werde dankbar sein, wenn mich jemand führen könnte.

Antwort

0

Zum einfachen, lösche ich die Mitglieder.

package main 

import (
    "fmt" 
    "encoding/json" 

    "gopkg.in/mgo.v2" 
    "gopkg.in/mgo.v2/bson" 
) 

func main() { 
    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("test").C("mgo") 

    cond := bson.M{"$and": []bson.M{bson.M{"details": bson.M{"$elemMatch": bson.M{"category": "A"}}}, bson.M{"status": 0}}} 
    query := bson.M{"$set": bson.M{"details.$.obj.guava": 15}} 

    res := []interface{}{} 
    err = c.Find(cond).All(&res) 

    if err != nil { 
     fmt.Println("Before Update Read Error:", err) 
     return 
    } 

    data, _ := json.MarshalIndent(res, "", " ") 
    fmt.Printf("Before Update Read: %s\n", string(data)) 

    err = c.Update(cond, query) 

    if err != nil { 
     fmt.Println("Update Error:", err) 
     return 
    } 

    fmt.Println("Update Succeed!") 

    err = c.Find(cond).All(&res) 
    if err != nil { 
     fmt.Println("After Update Read Error:", err) 
     return 
    } 

    data, _ = json.MarshalIndent(res, "", " ") 
    fmt.Printf("After Update Read: %s\n", string(data)) 
} 

Ergebnis:

Before Update Read: [ 
{ 
    "_id": 2, 
    "details": [ 
    { 
    "category": "A", 
    "id": 2, 
    "obj": { 
    "apple": 5, 
    "banana": 2, 
    "cherry": 10 
    } 
    } 
    ], 
    "status": 0 
} 
] 

Update Succeed! 

After Update Read: [ 
{ 
    "_id": 2, 
    "details": [ 
    { 
    "category": "A", 
    "id": 2, 
    "obj": { 
    "apple": 5, 
    "banana": 2, 
    "cherry": 10, 
    "guava": 15 
    } 
    } 
    ], 
    "status": 0 
} 
] 
+0

Siehe auch: https://docs.mongodb.com/manual/reference/operator/update/positional/#up._S_ –

+0

Danke für die Antwort, aber ich mache ich das selbe .. In der Abfrage habe ich versucht, indem ich "Dokument" entfernt habe (was ich hier verwende, um als Objektname darzustellen, dh wie der Sammlungsname), aber es aktualisiert das Objekt nicht. – MKB

+0

Vielleicht stimmt etwas nicht, bitte den Fehlerwert beim Aufruf von col.update() ausgeben –

Verwandte Themen