
AstraSerg
19.09.2018
19:08:38
Список со словерем внутри?

p4sh
19.09.2018
19:09:49
{
"_id" : ObjectId("5ba24958103b0ac162148f6f"),
"name" : "Иванов Иван Иваныч",
"floor" : 3,
"cardNo" : 34443, "dateIn" : 20180919,
"org" : [ {
"_id" : ObjectId("5ba24a53103b0ac162148f71"),
"company" : "Sun",
"floor" : 3,
"org" : 2
}
]
}

Google

AstraSerg
19.09.2018
19:14:13
Так, а попробуйте сменить as: company на as: comp в лукапе
Тут https://docs.mongodb.com/manual/reference/operator/aggregation/project/#include-specific-fields-from-embedded-documents пишут, что из списка возвращается список :( тогда просто добавьте ещё один стейдж: {$unwind: "org"}

p4sh
19.09.2018
19:27:53
Вы гений !)
А я мучал $company всякими forEach :D
> 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"
}
куда уж мне, админу)
ну ниче ;) осилит дорогу идущий
Жму руку - спасибо за наставления


AstraSerg
20.09.2018
04:50:23
Польщен, спасибо :) я и сам недопрограммер, недоадмин... Просто монгой решил заняться, вот и чухаю потихоньку.
Буду премного благодарен
еще сам погляжу сейчас
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.

p4sh
20.09.2018
05:08:13

AstraSerg
20.09.2018
05:09:33

Oleg
20.09.2018
08:01:58
Привет, есть ли возможность выдать пользователю право менять свой пароль?

Vova
20.09.2018
08:06:37
Полагаю создавать пользователя поверх другой базы данных и давать ему по необходимости права на запись в этой бд через роль

Google

p4sh
20.09.2018
08:08:16
Посмотрите, вдруг поможет:
https://docs.mongodb.com/manual/tutorial/change-own-password-and-custom-data/
use admin
db.createRole(
{ role: "changeOwnPasswordCustomDataRole",
privileges: [
{
resource: { db: "", collection: ""},
actions: [ "changeOwnPassword", "changeOwnCustomData" ]
}
],
roles: []
}
)
создание кастомной роли с определенным Action
Встроенной подобной роли вроде нет
есть такая встроенная которая может менять пароль любого пользователя
но врятли это удобно)

Oleg
20.09.2018
08:11:44
да, читаю про changeOwnPasswordCustomDataRole. знаком с монгой буквально 4й день, и не понимаю такой штуки как юзер внутри базы. это получается мне надо делать бесправного юзера с тем-те именем в базе admin?

p4sh
20.09.2018
08:25:48
-_- зачем
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
20.09.2018
08:29:52
странные вещи получаеются есть запрос find({field1: {$exists: true}, field2: false}).limit(1000)
итерация по курсору ничего по времени не занимает
а вот
cursor.count()
270+ секунд
коллекция 100+ миллионов

Nick
20.09.2018
08:40:57

Bro
20.09.2018
08:41:16
list(objs)
мда странно реально cusror.count()
мистика какая-то

Google

Constantin
20.09.2018
09:38:15

Bro
20.09.2018
09:40:31

Nick
20.09.2018
09:48:29
это вы замерили каунт, а как замеряете итерации по курсору?

Bro
20.09.2018
09:51:17
list(users[:1000])

Nick
20.09.2018
09:51:40
так выведите всех юзеров а не с лимитом

Bro
20.09.2018
09:52:16
там батч процессинг берется 1000 документов с коллекции обрабатывается и затем процесс перезапускается

Nick
20.09.2018
09:52:49
и что? вы сравниваете время обхода всей коллекции и поулчения 1000 доков, не кажется ли вам что это некорректно сравнивать?
давайте сравнивать по нормальному

Bro
20.09.2018
09:53:07
в итоге я явно курсор преобразую users_list = list(users) и вместо users.count() делаю len(users_list)
почему он обходит коллекцию

Nick
20.09.2018
09:53:42
а что делает ваш list(user) ?

Bro
20.09.2018
09:53:53
преобразует курсор в список

Nick
20.09.2018
09:54:15
нет, что под капотом делается? я не силен в питонах, поэтому нужно от вас это узнать
он просто обертку делает или как

AstraSerg
20.09.2018
09:56:55
list(users[:1000])
Пордозреваю, что здесь при вызове users[...] идёт неявное преобразование курсора в список, для которого требуется фетч всех документов. И тогда сравнение действетельно не корректное, как и писал @yatoba

Bro
20.09.2018
09:57:11
я вот тоже подозреваю
вернее не подозреваю а прям знаю
что он зачем-то сканирует полностью коллекцию
причем

Google

AstraSerg
20.09.2018
09:57:54

Nick
20.09.2018
09:58:06
я чтото потерял суть разговора, давайте по новой, в чем пробелма?

Bro
20.09.2018
09:58:39
причем то же самое с монгоконсоли происходит
с = db.usernames.find({...}).limit(1000)
c.count()

AstraSerg
20.09.2018
09:59:21

Bro
20.09.2018
09:59:28
интересно
там есть with_limit_and_skip=False
хм
https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/cursor.py#L712
там написано что Returns the number of documents in the results set for this query. Does
not take :meth:limit and :meth:skip into account by default
да но тогда почему обычный .count() занимает столько времени

AstraSerg
20.09.2018
10:04:43

Bro
20.09.2018
10:06:08
он только недавно стал deprecated
да и какая разница говорю же из монго консоли то же самое
на js
надо на jira еще у них пошуршать

Nick
20.09.2018
10:09:30
и всетаки я не могу понять в чем проблема. в том что время получения курсора и вермя выполнения метода count разное?

Bro
20.09.2018
10:10:09
непонятно почему он сканирует всю коллекцию при вызове метода.

Nick
20.09.2018
10:10:19
какого метода?

Google

Vova
20.09.2018
10:10:48
Курсор просто описывает запрос к бд, а выполнение всех действий курсора выполняется уже при соответствующем вызове

Bro
20.09.2018
10:12:50
нашел https://jira.mongodb.org/browse/SERVER-3268?jql=text%20~%20%22cursor%20count%22
> c.count(true)
1000
вооо
так быстро работает
вообщем после .limit() если хочешь узнать сколько там элементов в курсоре нужно делать cursor.count(true)

Nick
20.09.2018
10:15:18
только вот порос зчем вам каунт если вы его итак лимитировали 1000

Bro
20.09.2018
10:15:47
а там может быть меньше / больше

Nick
20.09.2018
10:16:02
больше не может, лимит же

Bro
20.09.2018
10:16:12
cursor.count(with_limit_and_skip=True) в pymongo
1000 от балды значение вариативно

Nick
20.09.2018
10:17:09
я не про это, суть count() посчитать количество доков подходящих под условие, которые лежат в бд
какой смысл запрашивать количество доков которые вы итак вытаскиваете из бд посредством курсора, которому наплевать на количество
может опишите задачу которую вы решаете и я тогда пойму почему так а не иначе

Bro
20.09.2018
10:18:54
https://docs.mongodb.com/manual/reference/method/cursor.count/
Counts the number of documents referenced by a cursor. Append the count() method to a find() query to return the number of matching documents.
решена задача уже