使用的bson功能创建查询时遇到了一些麻烦mgo。我只是想做{'search_id': {'$in': [1,2,4,7,9]}},但是我不知道怎么做mgo。
mgo
{'search_id': {'$in': [1,2,4,7,9]}}
我有一个ints,并尝试直接传递它:
int
toRemove := []int{1,2,4,7,9} err = coll.Remove(bson.M{"search_id": bson.M{"$in": toRemove}})
我看到了另一条建议使用的帖子[]interface{},但这也不起作用:
[]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上浏览了他的文档和其他问题,但是大多数涉及切片的问题似乎都是关于将数据分成一个切片,而不是我想要达到的目的。
非常感激任何的帮助。
您最初的建议(通过[]int值)没有缺陷,这样做是有效的。
[]int
问题是您使用Collection.Remove()它来查找和删除与提供的选择器文档匹配的 单个 文档。因此,您提出的解决方案将 精确 删除 1个文档 ,该 文档search_id包含在您传递的切片中。如果未找到此类文档(会话处于安全模式,请参见Session.SetSafe()),mgo.ErrNotFound则返回该文档。
Collection.Remove()
search_id
Session.SetSafe()
mgo.ErrNotFound
而是使用Collection.RemoveAll()which查找和删除 所有 与选择器匹配的文档:
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) }