Oll*_*y B 2 go slice mongodb mgo
我在使用mgo. 我只是想做{'search_id': {'$in': [1,2,4,7,9]}},但我不知道如何在mgo.
我有一片ints,并尝试直接传递它:
toRemove := []int{1,2,4,7,9}
err = coll.Remove(bson.M{"search_id": bson.M{"$in": toRemove}})
Run Code Online (Sandbox Code Playgroud)
我看到另一篇文章建议我需要使用[]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}})
Run Code Online (Sandbox Code Playgroud)
我已经浏览了他的文档和其他问题here和gh,但大多数涉及切片的问题似乎都是关于将数据放入切片,而不是我想要实现的目标。
非常感激任何的帮助。
您的原始提案(传递[]int值)没有缺陷,这样做是有效的。
问题是您使用Collection.Remove()which 查找并删除与提供的选择器文档匹配的单个文档。因此,您提出的解决方案将完全删除1 个文档,其中一个search_id包含在您传递的切片中。如果未找到此类文档(并且会话处于安全模式,请参阅Session.SetSafe()),mgo.ErrNotFound则返回。
而是使用Collection.RemoveAll()which 查找并删除与选择器匹配的所有文档:
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)
}
Run Code Online (Sandbox Code Playgroud)