#mongodb #go #mongo-go
#mongodb #Вперед #монго-го
Вопрос:
Я пытаюсь проверить, существует ли срез подписок, а также содержит ли он хотя бы одну переменную с именем premium со значением true.
Если это так, он должен вернуться, если нет, он не должен возвращаться. В настоящее время он возвращает объект в коллекцию, даже если значение установлено в false.
// query to find all the users accounts that have purchased premium subscriptions
hasPurchasedSubscriptions := c.QueryParam("hasPurchasedSubscriptions")
if hasPurchasedSubscriptions != "" {
pipeline = append(pipeline, bson.M{
"$match": bson.M{"$and": []interface{}{
bson.M{"subscriptions": bson.M{"$exists": true}},
bson.M{"subscriptions": bson.M{"$elemMatch": bson.M{"premium": true}}},
}},
})
}
})
Ответ №1:
Просто используйте:
pipeline = append(pipeline, bson.M{
"$match": bson.M{
"subscriptions": bson.M{"$elemMatch": bson.M{"premium": true}},
},
})
Нет необходимости проверять, существует ли он, он должен, иначе у него не может быть элемента с. premium=true
И если у вас есть только одно условие для элемента, вы также можете упростить его до:
pipeline = append(pipeline, bson.M{
"$match": bson.M{"subscriptions.premium": true},
})
Комментарии:
1. Спасибо! как мне узнать, нет ли у них какой-либо премии, установленной в true для ложного случая?
2. @John Отменяет условие:
{"subscriptions.premium":{$ne:true}}
. Это также вернет документы, в которых нет поля подписки