mongo go, если [] пуст, считает его ложным

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