一尘不染

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

go

使用的bson功能创建查询时遇到了一些麻烦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}})

我看到了另一条建议使用的帖子[]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}})

我在这里和gh上浏览了他的文档和其他问题,但是大多数涉及切片的问题似乎都是关于将数据分成一个切片,而不是我想要达到的目的。

非常感激任何的帮助。


阅读 218

收藏
2020-07-02

共1个答案

一尘不染

您最初的建议(通过[]int值)没有缺陷,这样做是有效的。

问题是您使用Collection.Remove()它来查找和删除与提供的选择器文档匹配的
单个 文档。因此,您提出的解决方案将 精确 删除 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)
}
2020-07-02