将MongoDB函数foreach转换为mgo(Golang)函数

时间:2018-05-24 13:41:12

标签: mongodb go mgo

这是尝试通过其值

更新代码匹配的函数

Element res collectioncode of Marquedoc.Marque进行比较,如果是value of the marque则将其替换为mongoDB CLI

此代码在GO中完美运行,但正如我正在使用mgo

我尝试将其转换为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}); } }); 中找不到foreach函数,在这种情况下是否有东西需要替换?谢谢你的帮助

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}}

1 个答案:

答案 0 :(得分:2)

访问mgo Godoc可能会帮助您了解其工作原理。

其次,Golang中的导出类型/函数以大写字母开头。因此,res.findbrands.findOne,...应分别为res.Findbrands.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)
}