使用 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
如何使用 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