Если срез существует и если он содержит хотя бы одну конкретную переменную, для которой установлено значение true

#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}} . Это также вернет документы, в которых нет поля подписки