如何将int切片传递给" $ in"使用mgo

时间:2017-03-08 08:01:06

标签: mongodb go slice mgo

我在使用mgo的bson功能创建查询时遇到了一些麻烦。我只是尝试{'search_id': {'$in': [1,2,4,7,9]}},但我无法在mgo中找到解决方法。

我有一片int s,并尝试直接传递:

toRemove := []int{1,2,4,7,9}
err = coll.Remove(bson.M{"search_id": bson.M{"$in": toRemove}})

我看到另一篇文章建议我需要使用[]interface{},但这也不起作用:

toRemoveI := make([]interface{}, len(toRemove))
for idx, val := range toRemove {
    toRemoveI[idx] = val
}
err = coll.Remove(bson.M{"search_id": bson.M{"$in": toRemoveI}})

我已经在这里查看了文档和其他问题,但是大多数涉及切片的问题似乎都是将数据放入切片而不是我想要实现的目标。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

您的原始提案(传递[]int值)没有任何缺陷,这样做是有效的。

问题在于您使用Collection.Remove()查找并删除与提供的选择器文档匹配的单个文档。因此,您提出的解决方案将删除正好1个文档,其中search_id包含在您传递的切片中。如果未找到此类文档(并且会话处于安全模式,请参阅Session.SetSafe()),则会返回mgo.ErrNotFound

而是使用Collection.RemoveAll()查找并删除与选择器匹配的所有文档:

toRemove := []int{1,2,4,7,9}
info, err := c.RemoveAll(bson.M{"search_id": bson.M{"$in": toRemove}})

if err != nil {
    log.Printf("Failed to remove: %v", err)
} else {
    log.Printf("Removed %d documents.", info.Removed)
}