如何使用GoLang在MongoDB中执行插入操作?

时间:2018-10-04 09:37:10

标签: mongodb go bulkinsert mgo

我有一个存储大量数据的数组,我需要将这些数据插入MongoDB中。

我可以使用以下代码实现这一目标。但是需要1.5分钟。我需要在几秒钟内推动。还有其他方法可以将大量数组数据推入MongoDB吗?

HeadDet是一个数组,有300万个记录。

session, err := mgo.Dial(“localhost”)
if err != nil {
  panic(err)
}
defer session.Close()
// Optional. Switch the session to a monotonic behavior.
session.SetMode(mgo.Monotonic, true)

c := session.DB("Test").C("Indicators")

for i := 0; i < len(HeadDet); i++ {
  err = c.Insert(HeadDet[i])
}
if err != nil {
  log.Fatal(err)
}

我已经推荐了this链接

1 个答案:

答案 0 :(得分:3)

首先,放下labix.org/mgo(又名gopkg.in/mgo.v2),它已过时,不需要维护。而是使用社区支持的分支:github.com/globalsign/mgo

接下来,要批量执行插入或更新操作,请使用Bulk API introduced in MongoDB 2.6mgo驱动程序支持使用mgo.Bulk类型的批量操作。

您要插入“ 30万条记录”。对于不知道的人,"lakh"是印度编号系统中的一个单位,等于十万(100,000)。所以300万等于300万。

使用Bulk API,您可以通过这种方式高效地插入所有API:

c := session.DB("Test").C("Indicators")

// BULK, ORDERED
bulk := c.Bulk()
for i := 0; i < len(HeadDet); i++ {
    bulk.Insert(HeadDet[i])
}
res, err := bulk.Run()

请注意,如果您不关心插入顺序,则可以将批量操作置于无序模式,这样可以加快操作速度:

// BULK, UNORDERED
bulk := c.Bulk()
bulk.Unordered()
for i := 0; i < len(HeadDet); i++ {
    bulk.Insert(HeadDet[i])
}
res, err := bulk.Run()

为进行比较,在我的计算机上(客户端-服务器是同一台计算机,因此没有网络延迟),具有300万个单独插入的循环需要5分钟43秒。

有序的批量操作插入300万个文档需要 18.6秒!

插入300万个文档的无序批量操作需要 18.22秒!