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

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,但大多数涉及切片的问题似乎都是关于将数据放入切片,而不是我想要实现的目标。

非常感激任何的帮助。

icz*_*cza 5

您的原始提案(传递[]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)