преобразование функции MongoDB foreach в функцию mgo (Golang) - PullRequest
0 голосов
/ 24 мая 2018

Это функция, которая пытается обновить код, соответствующий его значению

res collection как имеющему code of Marque, оно будет сравниваться с doc.Marque, если это так, его заменят наvalue of the marque.

Этот код отлично работает в mongoDB CLI, но, поскольку я работаю с GO.

, я попытался преобразовать его в mgo, как вы можете видетьниже, но это не работает, я не нашел функцию foreach в mgo, есть ли что-то, чтобы заменить в этом случае?спасибо за помощь

db.res.find().forEach(function(doc){

var v = db.brands.findOne({code: doc.Marque});
if(v){ 
    db.res.update({"Marque": doc.Marque},
                  {$set: {"Marque":v.value}}, {multi: true});
     }
});

Вот что я попробовал:

result:=Results{}
pipe:=res.find(bson.M{}).Iter()

for pipe.Next(&result) {
brands:=brands.findOne({code: doc.Marque});

   if(v){ 

   pipe.update({"Marque": doc.Marque},
     {$set: {"Marque": v.value}}, {multi: true});

    }
                       }

1 Ответ

0 голосов
/ 25 мая 2018

Посетите mgo Годок может помочь вам понять, как это работает.

Во-вторых, экспортируемые типы / функции в Голанге начинаются с заглавной буквы.Так что res.find, brands.findOne, ... должны быть res.Find, brands.FineOne соответственно, если такие функции существуют.

// let's say you have a type like this
type myResult struct {
    ID     bson.ObjectId `bson:"_id"`
    Marque string        `bson:"Marque"`
    // other fields...
}

// and another type like this
type myCode struct {
    Code string `bson:"code"`
    // other fields...
}

res := db.C("res")
brands := db.C("brands")
result := myResult{}

// iterate all documents
iter := res.Find(nil).Iter()    
for iter.Next(&result) {
    var v myCode
    err := brands.Find(bson.M{"code": result.Marque}).One(&v)
    if err != nil {
        // maybe not found or other reason,
        // it is recommend to have additional check
        continue
    }

    query := bson.M{"_id": result.ID}
    update := bson.M{"Marque": v.value}
    if err = res.Update(query, update); err != nil {
        // handle error
    }
}

if err := iter.Close(); err != nil {
    fmt.Println(err)
}
...