Согласно документации , $ 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" } } ])
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
предпочтены, если список потрясающих заданий не должен быть изменен во время операции Вашей программы.
if job in ("mechanic", "tech"):
print "awesome"
elif job in ("tool", "rock"):
print "dolt"
Можно использовать в:
if job in ["mechanic", "tech"]:
print "awesome"
При проверке очень больших количеств, это может также стоить сохранить от ряда объектов для проверки, поскольку это будет быстрее. Например,
AwesomeJobs = set(["mechanic", "tech", ... lots of others ])
...
def func():
if job in AwesomeJobs:
print "awesome"
В то время как я не думаю, что можно сделать то, что Вы хотите непосредственно, одна альтернатива:
if job in [ "mechanic", "tech" ]:
print "awesome"
elif job in [ "tool", "rock" ]:
print "dolt"
Кортежи с постоянными объектами хранятся самими как константы в скомпилированной функции. Они могут быть загружены единственной инструкцией. Списки и наборы, с другой стороны, всегда создаются снова на каждом выполнении.
И кортежи и списки используют линейный поиск в операторе. Наборы используют основанный на хеше поиск, таким образом, это будет быстрее для большего числа вариантов.
На других языках я использовал бы оператор переключателя/выбора, чтобы сделать задание. можно сделать это в Python также .