mon go - go -driver: вложенный фильтр запросов OR / AND - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь создать фильтр запросов MongoDB с вложенными операторами (ИЛИ / И / ...). Но lib требует создания bson.D и передачи в него bson.E элементов. Если мне нужно иметь OR/AND внутри AND/OR - мне нужно поместить bson.M + bson.D внутри bson.D следующим образом:

filter := bson.M{"$and": bson.D{{"p", 10}, bson.M{"$or": bson.D{{"s", 30}, {"a", 1}}}}}

.. и, конечно, это не работает: cannot use primitive.M literal (type primitive.M) as type primitive.E in slice literal , Вероятно, та же проблема произойдет, если позже я попытаюсь использовать ... in [] логику внутри bson.D

Как мне создать такие вложенные запросы в Go и официальном драйвере MongoDB?

1 Ответ

1 голос
/ 01 апреля 2020

Важно то, что $or требует массив, который равен bson.A. Также $and является значением по умолчанию, вам не нужно указывать это.

Ваш фильтр может быть определен так:

filter := bson.D{
    {"p", 10},
    {"$or", bson.A{
        bson.D{{"s", 30}},
        bson.D{{"a", 10}},
    }},
}

Вы также можете использовать это:

filter = bson.D{
    {"p", 10},
    {"$or", bson.A{
        bson.M{"s": 30},
        bson.M{"a": 10},
    }},
}

Или это:

filter := bson.M{
    "p": 10,
    "$or": bson.A{
        bson.M{"s": 30},
        bson.M{"a": 10},
    },
}
...