оператор $in выдает ошибку, если передать в него пустой массив

# #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{} .