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

Dynamically insert multiple documents using mgo golang mongodb

如何使用 mgo library using only a single DB call as in db.collection.insert() 将文档数组插入 MongoDB?

我有以下 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()

中所述

我尝试使用 c.Insert 的 mgo

以下是代码片段:

  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: cannot use u (type *[]Transaction) as type []interface {} in argument to c.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() 函数 returns 指向 *Bulk 的指针。

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

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

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

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

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

改为将 ui 传递给 c.Insert