Используя ИЛИ сравнения с операторами IF [дубликат]

Согласно документации , $ lookup может присоединиться только к одной внешней коллекции.

Что вы могли бы сделать, это объединить userInfo и userRole в одну коллекцию, так как приведенный пример основан на реляционной схеме БД. Mongo - это база данных noSQL, и для этого требуется другой подход к управлению документами.

Ниже приведен двухэтапный запрос, который объединяет userInfo с userRole - создание новой временной коллекции, используемой в последнем запросе, для отображения комбинированных данных. В последнем запросе есть опция использования $ out и создания новой коллекции с объединенными данными для последующего использования.

create collections

blockquote>
db.sivaUser.insert(
{    
    "_id" : ObjectId("5684f3c454b1fd6926c324fd"),
        "email" : "admin@gmail.com",
        "userId" : "AD",
        "userName" : "admin"
})

//"userinfo"
db.sivaUserInfo.insert(
{
    "_id" : ObjectId("56d82612b63f1c31cf906003"),
    "userId" : "AD",
    "phone" : "0000000000"
})

//"userrole"
db.sivaUserRole.insert(
{
    "_id" : ObjectId("56d82612b63f1c31cf906003"),
    "userId" : "AD",
    "role" : "admin"
})

"присоединить" все: -)

blockquote>
db.sivaUserInfo.aggregate([
    {$lookup:
        {
           from: "sivaUserRole",
           localField: "userId",
           foreignField: "userId",
           as: "userRole"
        }
    },
    {
        $unwind:"$userRole"
    },
    {
        $project:{
            "_id":1,
            "userId" : 1,
            "phone" : 1,
            "role" :"$userRole.role"
        }
    },
    {
        $out:"sivaUserTmp"
    }
])


db.sivaUserTmp.aggregate([
    {$lookup:
        {
           from: "sivaUser",
           localField: "userId",
           foreignField: "userId",
           as: "user"
        }
    },
    {
        $unwind:"$user"
    },
    {
        $project:{
            "_id":1,
            "userId" : 1,
            "phone" : 1,
            "role" :1,
            "email" : "$user.email",
            "userName" : "$user.userName"
        }
    }
])

13
задан Quinn Taylor 12 July 2009 в 00:33
поделиться

6 ответов

if job in ("mechanic", "tech"):
    print "awesome"
elif job in ("tool", "rock"):
    print "dolt"

значения в круглых скобках являются кортежем. in проверки оператора, чтобы видеть, происходит ли объект левой стороны где-нибудь в правильном кортеже дескриптора.

Примечание, что, когда Python ищет кортеж или список с помощью in оператор, оно делает линейный поиск. Если у Вас есть большое количество объектов на правой стороне, это могло бы быть узким местом производительности. Более широкий масштаб способ сделать это должен был бы использовать frozenset :

AwesomeJobs = frozenset(["mechanic", "tech", ... lots of others ])
def func():
    if job in AwesomeJobs:
        print "awesome"

использование frozenset более чем set предпочтены, если список потрясающих заданий не должен быть изменен во время операции Вашей программы.

36
ответ дан 1 December 2019 в 18:06
поделиться
if job in ("mechanic", "tech"):
    print "awesome"
elif job in ("tool", "rock"):
    print "dolt"
1
ответ дан 1 December 2019 в 18:06
поделиться

Можно использовать в:

if job  in ["mechanic", "tech"]:
    print "awesome"

При проверке очень больших количеств, это может также стоить сохранить от ряда объектов для проверки, поскольку это будет быстрее. Например,

AwesomeJobs = set(["mechanic", "tech", ... lots of others ])
...

def func():
    if job in AwesomeJobs:
        print "awesome"
4
ответ дан 1 December 2019 в 18:06
поделиться

В то время как я не думаю, что можно сделать то, что Вы хотите непосредственно, одна альтернатива:

if job in [ "mechanic", "tech" ]:
    print "awesome"
elif job in [ "tool", "rock" ]:
    print "dolt"
1
ответ дан 1 December 2019 в 18:06
поделиться

Кортежи с постоянными объектами хранятся самими как константы в скомпилированной функции. Они могут быть загружены единственной инструкцией. Списки и наборы, с другой стороны, всегда создаются снова на каждом выполнении.

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

1
ответ дан 1 December 2019 в 18:06
поделиться

На других языках я использовал бы оператор переключателя/выбора, чтобы сделать задание. можно сделать это в Python также .

0
ответ дан 1 December 2019 в 18:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: