使用mgo golang mongodb动态插入多个文档

时间:2018-02-18 09:10:46

标签: database mongodb go nosql mgo

如何使用mgo只使用数据库调用将文档数组插入到MongoDB中,如db.collection.insert()所示?

我有以下Transaction结构:

    type Transaction struct {
    Brand         string `json:"brand"`
    Name          string `json:"name"`
    Plu           string `json:"plu"`
    Price         string `json:"price"`
  }

POST请求我将收到一系列这些结构。我想将它们作为单个文档插入到MongoDB中,但是使用单个数据库调用,如db.collection.insert()中所述

我尝试使用mgo的c.Insert

以下是代码段:

  func insertTransaction(c *gin.Context) {
    var transactions []Transaction
    err := c.BindJSON(&transactions)
    if err != nil {
        c.AbortWithStatusJSON(http.StatusBadRequest, map[string]string{"error":"invalid JSON"})
        return
    }
    err = InsertTransactons(transactions)
    if err != nil {
        c.AbortWithStatusJSON(http.StatusInternalServerError, &map[string](interface{}){
            "status":  "error",
            "code":    "500",
            "message": "Internal server error",
            "error": err,
        })
        return
    }
    c.JSON(http.StatusCreated, &map[string](interface{}){
        "status":  "success",
        "code":    "0",
        "message": "created",
    })
  }


  func InsertTransactons(u []Transaction) error {
    s := GetSession()
    defer s.Close()
    c := s.DB(DB).C(TransactionColl)
    err := c.Insert(u...)
    if err != nil {
        return err
    }
    return nil
  }

但是当我编译并运行代码时,我收到以下错误:

  

go / database.go:34:17:不能使用u(类型* [] Transaction)作为类型   [] interface {}在c.Insert

的参数中

2 个答案:

答案 0 :(得分:4)

您无法将[]*Transaction作为[]interface{}传递。您需要将每个Transaction转换为inferface{}以更改其内存布局。

var ui []interface{}
for _, t := range u{
    ui = append(ui, t)
}

将ui传递给c.Insert而不是

答案 1 :(得分:2)

通过使用带有可变参数的Bulk insert附加然后插入数据来为文档结构创建接口片。

type Bulk struct {
    // contains filtered or unexported fields
}
func (b *Bulk) Insert(docs ...interface{})

Bulk

中插入文件
const INSERT_COUNT int = 10000

type User struct {
    Id    bson.ObjectId `bson:"_id,omitempty" json:"_id"`
    Email string        `bson:"email" json:"email"`
}

func (self *User) Init() {
    self.Id = bson.NewObjectId()
}

从数据库连接返回的集合上调用Bulk()函数。 Bulk()函数返回指向*Bulk的指针。

bulk := dbs.Clone().DB("").C("users").Bulk()
bulk.Insert(users...)

将其分配给变量,该变量将用于使用Insert()指针接收器调用Bulk方法。

func main(){
    // Database
    dbs, err := mgo.Dial("mongodb://localhost/")
    if err != nil {
        panic(err)
    }
    // Collections
    uc := dbs.Clone().DB("").C("users")
    defer dbs.Clone().DB("").Session.Close()
    for n := 0; n < b.N; n++ {
        count := INSERT_COUNT
        users := make([]interface{}, count)
        for i := 0; i < count; i++ {
            loop_user := User{}
            loop_user.Init()
            loop_user.Email = fmt.Sprintf("report-%d@example.com", i)
            users[i] = loop_user
        }
        bulk := uc.Bulk()
        bulk.Unordered()
        bulk.Insert(users...)
        _, bulkErr := bulk.Run()
        if bulkErr != nil {
            panic(err)
        }
    }
}