Как передать 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)
}
Другие вопросы по тегам