如何向MongoDB一次性的批量insert数据?

使用mgo driver,如何向MongoDB一次性的批量insert数据?

在mgo文档中,insert的定义是这样的,

func (c *Collection) Insert(docs ...interface{}) error

也就是我可以调用一次,就insert多个document,但前提是,有几个document是在写代码的时候就知道的,比如:

var doc1, doc2, doc3  bson.M
// skip some code
col := database.C("aaaaaa")
col.Insert(doc1, doc2, doc3)

但我现在的麻烦是,在调用insert之前,document的数量是动态的,具体数量是在run的过程中计算出来的,有什么好办法只调用一次insert就搞定吗?

否则,我就只能循环很多次,每次insert一条document了。

共 11 个回复


jimmykuu

var docs []bson.M
docs = append(docs, doc1)
docs = append(docs, doc2)
// ...
col.Insert(docs...)
# 0

qkevin123

做成数组,站长真是强人啊,谢啦 !

# 1

qkevin123

好像不好使,它把docs当作一条document insert进去了 :(

# 2

jimmykuu

...加了么,我试了下,定义的时候要定义成interface{}

var docs []interface{}
docs = append(docs, doc1)
docs = append(docs, doc2)
col.Insert(docs...)
# 3

qkevin123

这样就搞定了。

主要是一开始,把定义写成了

var docs []bson.M

这样,

col.Insert(docs...)

build失败,所以就写成了

col.Insert(docs)

它把docs当作一条document insert进去了

# 4

lubia

我有一点疑惑,比如我有n个item要批量插入

type _item struct {
id string
name string
}

我按照上面所说以数组形式插入,但是报错了

var items = []_item{}
......
c.Insert(items...)

报错信息:

cannot use items (type []_item) as type []interface {} in function argument

# 5

nowayout

当然错了,人家的原型里面类型是interface{},你给的类型是[]_item

# 6

lubia

这种情况怎么处理?怎么转换?

# 7

jimmykuu

评论#4,定义成var items = []interface{},后面直接往里面append即可,interface{}可以接受任何类型。

# 8

lubia

thanks,搞定了

# 9

x0601y

mgo.insert插入的是[]interface{}切片 ,但我需要插入的其他类型的切片 怎么插呢? 或者说怎么将其他类型的切片转为[]interface{}呢

# 10