Как передать int срез в "$in" используя mgo
У меня возникли проблемы с созданием запроса с использованием функциональности bson mgo
, Я просто пытаюсь сделать {'search_id': {'$in': [1,2,4,7,9]}}
, но я не могу понять, как это сделать в mgo
,
У меня есть кусок int
и попытался передать это напрямую:
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, но большинство вопросов, касающихся срезов, похоже, касаются передачи данных в срез, а не того, чего я пытаюсь достичь.
Любая помощь будет наиболее ценной.
1 ответ
Ваше оригинальное предложение (прохождение []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)
}