Viktor
Я имел ввиду вложенный массив
Viktor
Как вы показали в общем
Viktor
Тогда индекс примерно будет таким {access: 1, name: 1, bid: 1}
Sergey
Какие-то странные проблемы на 100к записей
Oleg
Viktor
Viktor
Это index prefixing называется
Sergey
Только тогда и запрос с bid надо менять, чтобы в запросе bid был последним
Viktor
Sergey
Не факт
Viktor
Нужно просто удостовериться потом при помощи explain
Oleg
Viktor
Но это простой запрос, чтобы планировщик понял
Nick
эм
Nick
заморочился
Nick
).find({
"$or":[
{"owner_id" : 123, "bid":2321312},
{"admins.id" : 123, "bid":2321312}
]
})
Nick
"winningPlan" : {
"stage" : "SUBPLAN",
"inputStage" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "OR",
"inputStages" : [
{
"stage" : "IXSCAN",
"keyPattern" : {
"owner_id" : 1,
"bid" : 1
},
"indexName" : "owner_id_1_bid_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"owner_id" : [],
"bid" : []
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"owner_id" : [
"[123.0, 123.0]"
],
"bid" : [
"[2321312.0, 2321312.0]"
]
}
},
{
"stage" : "IXSCAN",
"keyPattern" : {
"admins.id" : 1,
"bid" : 1
},
"indexName" : "admins.id_1_bid_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"admins.id" : [],
"bid" : []
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"admins.id" : [
"[123.0, 123.0]"
],
"bid" : [
"[2321312.0, 2321312.0]"
]
}
}
]
}
}
},
Nick
как видно индексы юзаются
Oleg
Sergey
Я не раз сталкивался, что обычный and по двум полям сваливался в colscan, если порядок полей не соответствовал индексу.
По-моему этот случай даже в документации по pymongo описан при передаче dict-a, который не сортмрованный
Nick
Эксплейн https://pastebin.com/uvMDPsYb
Nick
"winningPlan" : {
"stage" : "SUBPLAN",
"inputStage" : {
"stage" : "SORT",
"sortPattern" : {
"name" : 1.0
},
"inputStage" : {
"stage" : "SORT_KEY_GENERATOR",
"inputStage" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "OR",
"inputStages" : [
{
"stage" : "IXSCAN",
"keyPattern" : {
"owner_id" : 1,
"bid" : 1
},
"indexName" : "owner_id_1_bid_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"owner_id" : [],
"bid" : []
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"owner_id" : [
"[123.0, 123.0]"
],
"bid" : [
"[2321312.0, 2321312.0]"
]
}
},
{
"stage" : "IXSCAN",
"keyPattern" : {
"admins.id" : 1,
"bid" : 1
},
"indexName" : "admins.id_1_bid_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"admins.id" : [],
"bid" : []
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"admins.id" : [
"[123.0, 123.0]"
],
"bid" : [
"[2321312.0, 2321312.0]"
]
}
}
]
}
}
}
}
Nick
db.getCollection('tst').find({
"$or":[
{"owner_id" : 123, "bid":2321312},
{"admins.id" : 123, "bid":2321312}
]
}).sort({name:1}).explain()
Nick
индексы те же что и в пастебине
Oleg
Итого? :)
Nick
итого тебе нужно переписать азпрос
Nick
и построить два инедкса
Oleg
Удаление индексов блокируют коллекцию?
Nick
добавление name к индксам, чуток меняет план на использование SORT_MERGE
Nick
если с ключом background:true то нет
Nick
момент
Oleg
Nick
упс, проглядел что вопрсо пр оудаление
Viktor
Итого получаем сортировку в памяти
Nick
там нет никак пробелм
Nick
Индексы:
Для овнера:
{
"owner_id" : 1,
"bid" : 1,
"name" : 1
}
Для админов:
{
"admins.id" : 1,
"bid" : 1,
"name" : 1
}
Фильтр для запросов:
{"$or":[
{"owner_id" : 123, "bid":2321312},
{"admins.id" : 123, "bid":2321312}
]}
Nick
Oleg
Nick
Nick
Как попробуете отпишистесь о результатах
Oleg
Oleg
Так как удалить индексы не вырубить приложение?
Nick
просто дропай и все
Nick
удаление только замедлит запросы, котоыре их использовали
Nick
а вот создание новых желательно в бекграунде, а то будет полноценный лок коллекции
Sergey
В идеале - по одной реплике переключать на новые индексы
Sergey
Но 100к - это мало, даже не в бекграунде построение индекса займёт несколько единиц секунд
Sergey
Хотя, в последних версиях вроде background-индексы не лочат слейвы
Viktor
Ребят, прошел курсы по монге, получил на почту от них вот такое: Become a MongoDB teaching assistant. We are looking to hire teaching assistants for future courses. As a top performer, you may qualify for this paid position. To apply, fill out this form and we will contact you if there is an opportunity.
Кто-нибудь участвовал в этом деле?
yopp
поучавствуешь — расскажи
Ilya
всем привет, тут глупые вопросы по монге задавать можно?
yopp
можно
Ilya
есть примерно такая коллекция:
{
_id: 1,
name: "name1"
prop: [
{ key: "key1", value: 75},
{ key: "key2", value: 78 },
{ key: "key3", value: 70 }
]
}
приходит список новых свойств вида
prop: [
{ key: "key1", value: 90},
{ key: "key4", value: 78 }
]
то есть одно свойство изменилось и одно добавилось - как седлать обновление объекта в монге?
yopp
двумя запросами, в одном $elemMatch и $set с $, а второй просто $push
Ilya
ок, просто в один запрос я тоже так и не смог придумать как это провернуть
eshch
а почему не хранить пропы как key1: 75 и т.д?
Ilya
ну это упрощеная модель приведена, сами объекты в массиве там имеют другую структуру
yopp
yopp
если потом надо будет индексировать по названию поля — это будет невозможно
yopp
а почти всегда такая задача возникает
eshch
точн
yopp
т.е. резонный запрос, формата: найди мне key5 со значением больше 17 не будет возможен
yopp
eshch
yopp
пропустил слово «по индексу»
Ilya
просто получается что мне проще получить старый обект в коде его модернизировать до нужного состояния а в монгу уже послать обновленный - чем пытаться в монге это запросами провернуть
eshch
с другой стороны могли бы уже сделать подобные индексы. ниче сложно вроде.
eshch
че-то такое ощущение что где-то такое есть
eshch
не могу вспомнить где
yopp
yopp
в мысле что не целиком обновлять документ, а только изменившиеся поля