Yaroslav
Точнее я хз как такие ситуации разруливаются и какие есть бест практис
Yaroslav
AstraSerg
AstraSerg
но такая остановка займёт значительно меньше времени, чем по вашему плану
Bro
просто .find().sort().limit() нет аггрегации
Bro
я могу ошибаться но мне кажется аггрегация будет работать точно так же
Bro
просто вместо find() будте {$match: {...}}
Bro
ну и тд
Bro
там 100м документов где-то есть поле removed: True но в большей части этого флага нет
Bro
и селект документов где 'removed': {'$ne': True}
Bro
может Sparse index попробовать
Bro
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.
Bro
отбросить доки где removed: true это и будет 'removed': {'$ne': True}
Nick
а можно попродробнее почему нельзя просто взят ьи искать по eq: false?
AstraSerg
yopp
Bro
Bro
В большей части документов
Nick
а индекс по полю есть?
Bro
Есть
Nick
он не спаршенный?
Nick
sparse
Bro
Нет
Bro
Я вот думаю сделать спаршеный
Nick
тогда попробуйте как и сказали выше $exists: false
AstraSerg
Yaroslav
Bro
Я бы сделал бэкап
Bro
На всякий случай
Yaroslav
ep4sh
Допустим я аггрегировал две коллекции:
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 } ] }Как теперь к этому объекту обратиться?
ep4sh
ЭЭЭ) прям тупняк
ep4sh
ровно как и вопрос наверн, сейчас переформулирую
ep4sh
Я хочу чтобы на выхлопе у меня было
{ "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "org" : "Sun", "cardNo" : 34443, "dateIn" : 20180919, "dateOut" : 20190920 }Как будто я сделал JOIN
Потом, все это дело в JSON отдал бы фронтенд разработчику (опять же себе😂😂 )
Реально? или я дофига хочу
ep4sh
> 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
Допустим я аггрегировал две коллекции:
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 и формируйт свой выхлоп :)
ep4sh
это был набор букв для меня, но я разберусь)
ep4sh
https://docs.mongodb.com/manual/reference/operator/aggregation/project/
ep4sh
это?)
AstraSerg
ep4sh
Спасибо)
AstraSerg
ща набросаю...
AstraSerg
Типа такого:
{$project: {name: 1, floor: 1, cardNo: 1,dateIn: 1, dateOut:1, org: '$company[0].company'}}
Это добавьте как следующий стейдж после лукап
Petro
как покдлючиться к базе если в ссылке +srv через studio 3t?
ep4sh
ep4sh
Супер)))
ep4sh
правда $company[0].company' не работает(
Anonymous
ep4sh
А если вот "$company.0.company"
{ "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "cardNo" : 34443, "org" : [ ] }
ep4sh
пустой список
Anonymous
пустой список
db.users.aggregate([ { $project: { name: 1, first: { $arrayElemAt: [ "$favorites", 0 ] }, last: { $arrayElemAt: [ "$favorites", -1 ] } } } ])
Anonymous
На вашом случай $favorites это company
ep4sh
понял, спс то есть обращение также, через список, попробую
Anonymous
ep4sh
Я добил
ep4sh
db.guest.aggregate([
{
$lookup: {
from: "rent",
localField: "org",
foreignField: "org",
as: "company"
}
},
{
$project: {
name: 1,
floor: 1,
cardNo: 1,
org: "$company.company"
}
}
]).pretty();
AstraSerg
AstraSerg
Но обратите внимание, что если отношение issue.org к renter.org не один к одному, то нужно использовать еще и $unwind
ep4sh
Отлично, поздравляю!
Смущает только что возвращается список org: [ “sun”], ноооо, думаю потом это можно обыграть
ep4sh
AstraSerg
ep4sh
AstraSerg
В прошлый раз вы говорили что в нем company - это список документов
AstraSerg
Нулевой элемент этого списка - это отдельный документ, одним из ключе которого является company
AstraSerg
А value этого ключа, как раз нужное вам название, Sun
ep4sh
{ "_id" : ObjectId("5ba24958103b0ac162148f6f"), "name" : "Иванов Иван Иваныч", "floor" : 3, "org" : 2, "cardNo" : 34443, "dateIn" : 20180919, "dateOut" : 20190920, "company" : [ { "_id" : ObjectId("5ba24a53103b0ac162148f71"), "company" : "Sun", "floor" : 3, "org" : 2 } ] }
ep4sh
Если делаю с нулём:
ep4sh
> 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" : [ ]
}