
Bro
19.09.2018
08:48:26
хм что-то туплю
$nin and $ne queries cannot be answered by indexes, and force collection scans. If you need to use these ensure you are filtering down using indexes as much as possible and leaving the $nin and $ne terms to the very last part of the query selector.
действительно так?
селекты по 100м коллекции с $ne занимают несколько миинут

Google

Bro
19.09.2018
08:49:21
эксплэйн показывает что идет сканирование коллекции

AstraSerg
19.09.2018
08:50:14

Yaroslav
19.09.2018
08:53:33
Точнее я хз как такие ситуации разруливаются и какие есть бест практис

AstraSerg
19.09.2018
08:55:28

Yaroslav
19.09.2018
09:04:19

AstraSerg
19.09.2018
09:06:05
но такая остановка займёт значительно меньше времени, чем по вашему плану

Bro
19.09.2018
09:12:13
просто .find().sort().limit() нет аггрегации

AstraSerg
19.09.2018
09:13:46

Bro
19.09.2018
09:14:18
я могу ошибаться но мне кажется аггрегация будет работать точно так же
просто вместо find() будте {$match: {...}}

Google

Bro
19.09.2018
09:14:34
ну и тд

AstraSerg
19.09.2018
09:15:06

Bro
19.09.2018
09:15:17
там 100м документов где-то есть поле removed: True но в большей части этого флага нет
и селект документов где 'removed': {'$ne': True}
может Sparse index попробовать
only contain entries for documents that have the indexed field, even if the index field contains a null value. The index skips over any document that is missing the indexed field. The index is “sparse” because it does not include all documents of a collection.

AstraSerg
19.09.2018
09:21:31

Bro
19.09.2018
09:22:02
отбросить доки где removed: true это и будет 'removed': {'$ne': True}

Nick
19.09.2018
09:23:25
а можно попродробнее почему нельзя просто взят ьи искать по eq: false?

AstraSerg
19.09.2018
09:24:35

yopp
19.09.2018
09:24:39

Bro
19.09.2018
09:25:32
В большей части документов

Nick
19.09.2018
09:25:48
а индекс по полю есть?

AstraSerg
19.09.2018
09:25:54

Bro
19.09.2018
09:25:54
Есть

Nick
19.09.2018
09:26:00
он не спаршенный?
sparse

Bro
19.09.2018
09:26:09
Нет

Google

Bro
19.09.2018
09:26:20
Я вот думаю сделать спаршеный

Nick
19.09.2018
09:29:04
тогда попробуйте как и сказали выше $exists: false

Yaroslav
19.09.2018
09:33:40

AstraSerg
19.09.2018
09:42:26

Yaroslav
19.09.2018
09:45:16

Bro
19.09.2018
09:53:53
Я бы сделал бэкап
На всякий случай

AstraSerg
19.09.2018
09:58:01

Yaroslav
19.09.2018
10:19:53


p4sh
19.09.2018
14:02:53
Допустим я аггрегировал две коллекции:
db.issue.aggregate([{
$lookup: {
from: "renter",
localField: "org",
foreignField: "org",
as: "company"
}
}]);
На выходе:
{ "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "org" : 2, "cardNo" : 34443, "dateIn" : 20180919, "dateOut" : 20190920, "company" : [ { "_id" : ObjectId("5ba24a53103b0ac162148f71"), "company" : "Sun", "floor" : 3, "org" : 2 } ] }Как теперь к этому объекту обратиться?
ЭЭЭ) прям тупняк
ровно как и вопрос наверн, сейчас переформулирую
Я хочу чтобы на выхлопе у меня было
{ "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "org" : "Sun", "cardNo" : 34443, "dateIn" : 20180919, "dateOut" : 20190920 }Как будто я сделал JOIN
Потом, все это дело в JSON отдал бы фронтенд разработчику (опять же себе?? )
Реально? или я дофига хочу
> db.renter.find();
{ "_id" : ObjectId("5ba24a44103b0ac162148f70"), "company" : "Microsoft", "floor" : 2, "org" : 1 }
{ "_id" : ObjectId("5ba24a53103b0ac162148f71"), "company" : "Sun", "floor" : 3, "org" : 2 }
> db.issue.find();
{ "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "org" : 2, "cardNo" : 34443, "dateIn" : 20180919, "dateOut" : 20190920 }


AstraSerg
19.09.2018
14:10:23
Допустим я аггрегировал две коллекции:
db.issue.aggregate([{
$lookup: {
from: "renter",
localField: "org",
foreignField: "org",
as: "company"
}
}]);
На выходе:
{ "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "org" : 2, "cardNo" : 34443, "dateIn" : 20180919, "dateOut" : 20190920, "company" : [ { "_id" : ObjectId("5ba24a53103b0ac162148f71"), "company" : "Sun", "floor" : 3, "org" : 2 } ] }Как теперь к этому объекту обратиться?
ну так добавьте стейдж $project и формируйт свой выхлоп :)

p4sh
19.09.2018
14:12:49
это был набор букв для меня, но я разберусь)
https://docs.mongodb.com/manual/reference/operator/aggregation/project/
это?)

AstraSerg
19.09.2018
14:13:32

Google

p4sh
19.09.2018
14:13:49
Спасибо)

AstraSerg
19.09.2018
14:13:54
ща набросаю...
Типа такого:
{$project: {name: 1, floor: 1, cardNo: 1,dateIn: 1, dateOut:1, org: '$company[0].company'}}
Это добавьте как следующий стейдж после лукап

Peter
19.09.2018
15:53:28
как покдлючиться к базе если в ссылке +srv через studio 3t?

p4sh
19.09.2018
15:56:46
Супер)))
правда $company[0].company' не работает(

Fozilbek
19.09.2018
16:43:30

p4sh
19.09.2018
16:45:21
пустой список

Fozilbek
19.09.2018
16:48:37
пустой список
db.users.aggregate([ { $project: { name: 1, first: { $arrayElemAt: [ "$favorites", 0 ] }, last: { $arrayElemAt: [ "$favorites", -1 ] } } } ])
На вашом случай $favorites это company

p4sh
19.09.2018
16:50:16
понял, спс то есть обращение также, через список, попробую

Fozilbek
19.09.2018
16:50:40

p4sh
19.09.2018
17:04:17
Я добил
db.guest.aggregate([
{
$lookup: {
from: "rent",
localField: "org",
foreignField: "org",
as: "company"
}
},
{
$project: {
name: 1,
floor: 1,
cardNo: 1,
org: "$company.company"
}
}
]).pretty();

AstraSerg
19.09.2018
17:57:00
Но обратите внимание, что если отношение issue.org к renter.org не один к одному, то нужно использовать еще и $unwind

p4sh
19.09.2018
18:01:50
Отлично, поздравляю!
Смущает только что возвращается список org: [ “sun”], ноооо, думаю потом это можно обыграть

Google

AstraSerg
19.09.2018
18:40:11

p4sh
19.09.2018
18:41:15

AstraSerg
19.09.2018
18:43:55
В прошлый раз вы говорили что в нем company - это список документов
Нулевой элемент этого списка - это отдельный документ, одним из ключе которого является company
А value этого ключа, как раз нужное вам название, Sun


p4sh
19.09.2018
18:53:13
{ "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "org" : 2, "cardNo" : 34443, "dateIn" : 20180919, "dateOut" : 20190920, "company" : [ { "_id" : ObjectId("5ba24a53103b0ac162148f71"), "company" : "Sun", "floor" : 3, "org" : 2 } ] }
Если делаю с нулём:
> db.guest.aggregate([
... {
... $lookup: {
... from: "rent",
... localField: "org",
... foreignField: "org",
... as: "company"... }
... },
... {
... $project: {
... name: 1,
... floor: 1,
... cardNo: 1,
... org: "$company.0.company",
... dateIn: 1,
... dateout: 1... }
... }
... ]).pretty();
{
"_id" : ObjectId("5ba24958103b0ac162148f6f"),
"name" : "Иванов Иван Иваныч",
"floor" : 3,
"cardNo" : 34443,
"dateIn" : 20180919, "org" : [ ]
}

AstraSerg
19.09.2018
18:57:35
Вот жеж!.. А если только $company[0] без окончания?

p4sh
19.09.2018
18:58:45
Тож)))
И {$company,0}, как в документации

AstraSerg
19.09.2018
19:01:04

p4sh
19.09.2018
19:02:01
Тож пустой?
> 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
}>
вообще пусто

AstraSerg
19.09.2018
19:03:30
Куда org делся?

p4sh
19.09.2018
19:04:10

AstraSerg
19.09.2018
19:05:02
Ну ладно, а если вообще без индекса, просто $company

p4sh
19.09.2018
19:07:09
Тогда выводится полный словарь (в списке)