#mongodb #go #mongo-go
#mongodb #Вперед #монго-перейти
Вопрос:
В настоящее время, если у пользователя есть объект subscriptions, но он пуст, т.е. [], он не будет считаться subscriptions = false .
// hasActiveSubscriptions
hasSubscriptions := c.QueryParam("hasSubscriptions")
if hasSubscriptions != "" {
hasSubscriptions = strings.ToUpper(hasSubscriptions)
if hasSubscriptions != "TRUE" amp;amp; hasSubscriptions != "FALSE" {
fmt.Println("hasSubscriptions query param is an invalid value")
}
res, err := strconv.ParseBool(hasSubscriptions)
if err != nil {
fmt.Println(err)
}
if res {
pipeline = append(pipeline, bson.M{
"$match": bson.M{
"subscriptions": bson.M{"$ne": nil},
},
})
} else {
pipeline = append(pipeline, bson.M{
"$match": bson.M{"subscriptions": nil},
})
}
}
Именно здесь происходит вызов.
В настоящее время он не возвращает никаких объектов, если я добавляю в конвейер любой из параметров запроса конвейера. У меня работают другие простые конвейерные запросы $match.
cur, err := collection.Aggregate(ctx, pipeline)
if err != nil {
return c.String(http.StatusNotFound, "No users found")
}
Ответ №1:
Если subscriptions
поле является необязательным в базе данных, то, если вы хотите фильтровать документы по подпискам, вы должны фильтровать по subscriptions
существующему значению и его размеру, превышающему 0
(достаточно условия больше нуля, так как это может быть только в том случае, если поле существует). Аналогично, если вам нужны документы без подписок, вы должны отфильтровать их по отсутствию или их размеру, равному 0
.
Более простым подходом является проверка существования первого элемента массива. Первый элемент массива может существовать, только если subscriptions
он существует и его размер больше, чем 0
, и если первый элемент не существует, то subscriptions
либо не существует, либо он пуст.
Так что просто используйте это:
pipeline = append(pipeline, bson.M{
"$match": bson.M{
"subscriptions.0": bson.M{"$exists": res},
},
})
Комментарии:
1. Для проверки того, были ли hasSubscriptions ложными, я попробовал: «$match»: bson. M{«$или»: []bson. M{{«подписки»: nil}, {«$size»: 0}}}, Но это не сработает, есть ли проблема с этим? Я буду использовать ваше решение, но хотел бы знать, что оно не сработает, спасибо
2. @John Этот фильтр будет выглядеть так:
"$match": bson.M{"$or": []interface{}{bson.M{"subscriptions": bson.M{"$exists": false}},bson.M{"subscriptions": bson.M{"$size": 0}}}}