AstraSerg
Вот жеж!.. А если только $company[0] без окончания?
ep4sh
Тож)))
ep4sh
И {$company,0}, как в документации
AstraSerg
Тож)))
Тож пустой?
ep4sh
Тож пустой?
> db.guest.aggregate([ ... { ... $lookup: { ... from: "rent", ... localField: "org", ... foreignField: "org",... as: "company" ... } ... }, ... { ... $project: { ... name: 1, ... floor: 1, ... cardNo: 1, ... org: "$company[0]", ... dateIn: 1,... dateout: 1 ... } ... } ... ]).pretty(); { "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "cardNo" : 34443, "dateIn" : 20180919 }>
ep4sh
вообще пусто
AstraSerg
Куда org делся?
ep4sh
Куда org делся?
Он просто не выводится
AstraSerg
Ну ладно, а если вообще без индекса, просто $company
ep4sh
Тогда выводится полный словарь (в списке)
ep4sh
Со всеми элементами
AstraSerg
Список со словерем внутри?
ep4sh
{ "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "cardNo" : 34443, "dateIn" : 20180919, "org" : [ { "_id" : ObjectId("5ba24a53103b0ac162148f71"), "company" : "Sun", "floor" : 3, "org" : 2 } ] }
AstraSerg
Так, а попробуйте сменить as: company на as: comp в лукапе
AstraSerg
Тут https://docs.mongodb.com/manual/reference/operator/aggregation/project/#include-specific-fields-from-embedded-documents пишут, что из списка возвращается список :( тогда просто добавьте ещё один стейдж: {$unwind: "org"}
ep4sh
Вы гений !)
ep4sh
А я мучал $company всякими forEach :D
ep4sh
> db.guest.aggregate([ ... { ... $lookup: { ... from: "rent", ... localField: "org", ... foreignField: "org", ... as: "company" ... } ... }, ... { ... $project: { ... name: 1, ... floor: 1, ... cardNo: 1, ... org: "$company.company", ... dateIn: 1, ... dateout: 1 ... } ... }, ... { ... $unwind: "$org" ... } ... ]).pretty(); { "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "cardNo" : 34443, "dateIn" : 20180919, "org" : "Sun" }
ep4sh
куда уж мне, админу) ну ниче ;) осилит дорогу идущий
ep4sh
Жму руку - спасибо за наставления
AstraSerg
Польщен, спасибо :) я и сам недопрограммер, недоадмин... Просто монгой решил заняться, вот и чухаю потихоньку.
AstraSerg
Буду премного благодарен еще сам погляжу сейчас
BTW еще одна БД здесь https://university.mongodb.com/static/MongoDB_2018_M101P_August/handouts/final7__f7_m101_52e000fde2d423744501d031.zip Импортировать mongoimport --db test --collection images images.json mongoimport --db test --collection albums albums.json Описание: The database consists of two collections, albums, and images. Every image is supposed to be in an album, but there are orphan images that appear in no album.
AstraSerg
хахах))) значит я не одинок!) за базу - отдельное спасибо!
Конечно! Думаете, все гениями рождаются? Нет, просто учишься работаешь. Причем не ток много как может показаться.
Oleg
Привет, есть ли возможность выдать пользователю право менять свой пароль?
Vova
Полагаю создавать пользователя поверх другой базы данных и давать ему по необходимости права на запись в этой бд через роль
ep4sh
Посмотрите, вдруг поможет: https://docs.mongodb.com/manual/tutorial/change-own-password-and-custom-data/
ep4sh
use admin db.createRole( { role: "changeOwnPasswordCustomDataRole", privileges: [ { resource: { db: "", collection: ""}, actions: [ "changeOwnPassword", "changeOwnCustomData" ] } ], roles: [] } )
ep4sh
создание кастомной роли с определенным Action
ep4sh
Встроенной подобной роли вроде нет
ep4sh
есть такая встроенная которая может менять пароль любого пользователя
ep4sh
но врятли это удобно)
ep4sh
Привет, есть ли возможность выдать пользователю право менять свой пароль?
А вот список встроенных ролей: https://docs.mongodb.com/manual/reference/built-in-roles/#built-in-roles
Oleg
да, читаю про changeOwnPasswordCustomDataRole. знаком с монгой буквально 4й день, и не понимаю такой штуки как юзер внутри базы. это получается мне надо делать бесправного юзера с тем-те именем в базе admin?
ep4sh
-_- зачем
ep4sh
MongoDB provides the built-in database user and database administration roles on every database. MongoDB provides all other built-in roles only on the admin database.
Bro
странные вещи получаеются есть запрос find({field1: {$exists: true}, field2: false}).limit(1000)
Bro
итерация по курсору ничего по времени не занимает
Bro
а вот
Bro
cursor.count()
Bro
270+ секунд
Bro
коллекция 100+ миллионов
Nick
итерация по курсору ничего по времени не занимает
а вы точно выбираете все запии из курсора? или логирете время только до получения курсора? если второе, то нужно понимать что курсор отдается как только повилась первая порция данных, а не все
Bro
list(objs)
Bro
мда странно реально cusror.count()
Bro
мистика какая-то
Constantin
странные вещи получаеются есть запрос find({field1: {$exists: true}, field2: false}).limit(1000)
Пришлите полный пример кода, в каком-нибудь pastebin или подобном
Nick
https://dumpz.org/akkqBxKpW6mN
э у вас там лимит
Nick
это вы замерили каунт, а как замеряете итерации по курсору?
Bro
list(users[:1000])
Nick
так выведите всех юзеров а не с лимитом
Bro
там батч процессинг берется 1000 документов с коллекции обрабатывается и затем процесс перезапускается
Nick
и что? вы сравниваете время обхода всей коллекции и поулчения 1000 доков, не кажется ли вам что это некорректно сравнивать?
Nick
давайте сравнивать по нормальному
Bro
в итоге я явно курсор преобразую users_list = list(users) и вместо users.count() делаю len(users_list)
Bro
почему он обходит коллекцию
Nick
а что делает ваш list(user) ?
Bro
преобразует курсор в список
Nick
нет, что под капотом делается? я не силен в питонах, поэтому нужно от вас это узнать
Nick
он просто обертку делает или как
AstraSerg
list(users[:1000])
Пордозреваю, что здесь при вызове users[...] идёт неявное преобразование курсора в список, для которого требуется фетч всех документов. И тогда сравнение действетельно не корректное, как и писал @yatoba
Bro
я вот тоже подозреваю
Bro
вернее не подозреваю а прям знаю
Bro
что он зачем-то сканирует полностью коллекцию
Bro
причем
AstraSerg
list(users[:1000])
Сравните type(users) и type(users[:1000])
Nick
я чтото потерял суть разговора, давайте по новой, в чем пробелма?
Bro
причем то же самое с монгоконсоли происходит
Bro
с = db.usernames.find({...}).limit(1000)
Bro
c.count()
AstraSerg
что он зачем-то сканирует полностью коллекцию
что значит зачем-то? по-другому ни как не сделать. Пока он курсор, данные из БД не фетчатся, когда становится списком (питоновским объектом) их нужно вытащить
Bro
интересно
Bro
там есть with_limit_and_skip=False
Bro
хм
Bro
https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/cursor.py#L712
Bro
там написано что Returns the number of documents in the results set for this query. Does not take :meth:limit and :meth:skip into account by default
Bro
да но тогда почему обычный .count() занимает столько времени