如何使用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
的参数中
答案 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)
}
}
}