Как я могу проверить любые 3 из 6 значений в одном документе

#python #database #mongodb #pymongo

#python #База данных #mongodb — монгодб #pymongo #mongodb

Вопрос:

Я создаю какую-то игру pokemon на Python, мне нужна помощь с агрегациями, такими как,

 # I have this at the moment.

# But I know that it isn't correct.
aggregations = [
    {
        "$match": {
            "$and": [
                {"$or": [{'hp': 28}, {'atk': 28}]},
                {"$or": [{'def': 28}, {'spatk': 28}]},
                {"$or": [{'spdef': 28}, {'speed': 28}]}
            ]
        }}]

  
 # Database Structure

# Pokemon, Level, XP, SPDEF, SPATK, SPEED, HP, ATK, DEF.
"""
So I have some flags namely --trip <val>, --quad <val>

So if user do --trip 31, So it should match that in SPDEF, SPATK, SPEED, HP, ATK, DEF (ANY THREE).
"""
  

Ответ №1:

С помощью $project вы можете сохранить в новой переменной, если ваше значение больше 28, и вы делаете это для каждого из ваших атрибутов.

Затем вы суммируете все новые переменные с новым $project

А затем сопоставлять только итоговые значения, которые больше или равны 3

 [
{
    "$project": {
        "has_hp": {
            "$cond": {
                "if": {"$gte": ["$hp", 28]},
                "then": 1,
                "else": 0,
            }
        },
        "has_atk": {
            "$cond": {
                "if": {"$gte": ["$hp", 28]},
                "then": 1,
                "else": 0,
            }
        },
        "has_def": {
            "$cond": {
                "if": {"$gte": ["$hp", 28]},
                "then": 1,
                "else": 0,
            }
        },
        "has_spatk": {
            "$cond": {
                "if": {"$gte": ["$hp", 28]},
                "then": 1,
                "else": 0,
            }
        },
        "has_spdef": {
            "$cond": {
                "if": {"$gte": ["$hp", 28]},
                "then": 1,
                "else": 0,
            }
        },
        "has_speed": {
            "$cond": {
                "if": {"$gte": ["$hp", 28]},
                "then": 1,
                "else": 0,
            }
        }
    }
},
{
    "$project": {
        "total": { "$add": ["$has_hp", "$has_atk", "$has_def", "$has_spatk", "$has_spdef", "$has_speed"]}
    }
},
{
    "$match": {"total": {"$gte": 3}}
}
]