# #mongodb #go #aggregation
#mongodb #Вперед #агрегация
Вопрос:
Я работал над проектом Go и MongoDB. В которой я столкнулся с проблемой. Я передал динамический срез целых чисел ([]int) в запрос с использованием оператора $in. Все кажется хорошим, но когда этот срез пуст, он возвращает ошибку «$in нуждается в массиве». Но я использовал его в качестве параметра поиска и хочу, чтобы, если я передам пустой массив, он совпал со всеми.
Примечание: У меня есть пользовательская оболочка MongoDB версии v5.0.3
Вот мой код:
var searchedProfiles []int searchFilter := bson.M{"customer.id": bson.M{"$in": searchedProfiles}} newQry := []bson.M{ {"$lookup": bson.M{ "localField": "cid", "from": "customers", "foreignField": "_id", "as": "customer"}}, {"$match": searchFilter}, }
Если у кого-нибудь есть какие-либо идеи, пожалуйста, дайте мне знать. Спасибо!
Ответ №1:
nil
значения не маршалируются как пустые массивы, поэтому убедитесь searchedProfiles
, что это не nil
так, но, по крайней мере, пустой срез:
searchedProfiles = []int{}
Это будет маршалировано в пустой массив, так что вы не получите ошибку, о которой идет речь.
Но это не даст вам всех документов, это не даст вам никаких результатов (в пустом списке ничего нет).
Если поисковых профилей нет, исключите это из фильтрации.
Комментарии:
1. Я отредактировал свой вопрос, но существует та же проблема. Если я передал empty []int в это, то верните ошибку вместо пустого результата.
2. Вы назначаете пустой срез
searchedProfiles
? Потому что код в вопросе-это не так. Кроме того, как отмечено в ответе, подгонка$in
для пустого массива даст вам нулевые результаты, а не все.3. В моем случае, если у поисковых файлов есть значения, такие как [1, 2] и т. Д., Тогда все работает хорошо, но мы его значение [], Тогда он выдает мне ошибку типа: { «ответ»: { «код»: 400, «api_status»: 0, «сообщение»: «Ошибка: #126 — Что-то не так, пожалуйста, повторите попытку позже.», «данные»: { «Код»: 2, «Сообщение»: «$in нуждается в массиве», «Метки»: null, «Имя»: «Неверное значение», «Завернуто»: null } } }
4. Да, я понимаю вашу ошибку и проблему, и это потому
searchedProfiles
, что естьnil
. Вы должны назначить ему пустой не —nil
срез:searchedProfiles = []int{}
. Но опять же, это не даст вам всех результатов, это не даст вам ничего.5. Если ты заявишь
var searchedProfiles []int
, что так оно и будетnil
, вот что я продолжаю говорить. Если вы назначите ему кусочек, его не будетnil
, что-то вродеvar searchedProfiles = []int{}
.