У меня проблемы с производительностью, я делаю раскрутку в массиве строк.По сути, мне нужно посчитать, сколько раз каждый элемент в массиве моего документа появляется.
Пример:
Док 1 [.... Facets: ["Academia", "Piscina", ""Кинотеатр "]]
Doc 2 [.... Грани: [" Academia "," Cozinha "," Cinema "]]]
Doc 3 [.... Грани: ["Купер "," Quadra de Futebol "," Cozinha "," Cinema "]] *
Итак, мой результат будет:
Академия: 2
Пишкина: 1
Кинотеатр: 3
Cozinha: 2
Quadra de Futebol: 1
Пример документа:
{
"_id" : ObjectId("5bab1d5e2172eda710338c5c"),
"SiteID" : "VR_1038936695_1",
"PriceSale" : 580000.0,
"Title" : "Apartamento a Venda em Salvador, Pituba, 4 dormitórios, 2 suítes,
4 banheiros, 2 vagas",
"Description" : "Apartamento 44 dormitórios (sendo 2 suítes), banheiros, 2
garagens, dependência de empregada, sala integrada à varanda.andar alto, 119
mº. Condomínio com infraestrutura completa: Piscina, quadra poliesportiva,
academia, salão de festas, brinquedoteca, parque infantil, salão de jogos,
playground com bastante área. Localização: Próximo ao Hiper Ideal, escolas,
faculdade, Mini Shopping, etc... <br> <br> OPORTUNIDADE!!! <br> <br> Agende
Sua Visita!!! <br> <br> <br> - Ar Condicionado <br> - Móveis Planejados <br>
- Portão Eletrônico <br> - Área de Serviço <br> - Cozinha <br> - Bares e
Restaurantes <br> - Escola <br> - Farmácia <br> - Shopping Center <br> -
Supermercado",
"Link" : "https://www.vivareal.com.br/imovel/apartamento-4-quartos-pituba-
bairros-salvador-com-garagem-119m2-venda-RS580000-id-1038936695/",
"QtyRoomsMin" : 4.0,
"QtyRoomsMax" : 4.0,
"QtySuitesMin" : 2.0,
"QtySuitesMax" : 2.0,
"QtyParkingSlotMin" : 2.0,
"QtyParkingSlotMax" : 2.0,
"AreaMin" : 119.0,
"AreaMax" : 119.0,
"QtyBathroomsMin" : 4.0,
"QtyBathroomsMax" : 4.0,
"SiteOrigin" : NumberInt(3),
"Type" : NumberInt(1),
"Subtype" : NumberInt(7),
"UpdateDate" : ISODate("2018-10-24T00:00:51.553+0000"),
"SortOrder" : NumberInt(280),
"IdDistrict" : NumberInt(1876),
"DistrictName" : "Pituba",
"IdCity" : NumberInt(988),
"CityName" : "Salvador",
"IdState" : NumberInt(5),
"StateName" : "Bahia",
"UF" : "BA",
"FullAddress" : "Rua Ceará",
"ZipCode" : NumberInt(41830450),
"Latitude" : null,
"Longitude" : null,
"IdTransaction" : NumberInt(1),
"ExpireAt" : ISODate("2018-11-12T23:00:51.553+0000"),
"Facets" : [
"Academia",
"Ar Condicionado",
"Área de Serviço",
"Cozinha",
"Espaço Verde / Parque",
"Piscina",
"Quadra Poliesportiva",
"Salão de jogos",
"Garagem"
]
}
Код в конвейере c # var= this.Collection.Aggregate (new AggregateOptions {AllowDiskUse = true}) .Match (фильтр) .Unwind (x => x.Facets) .SortByCount ("$ Facets");List listFacets = new List ();var output = pipe.ToList ();
Тот же запрос в MongoDB:
aggregate([
{
"$match": {
"Subtype": {
"$in": [
7
]
},
"IdTransaction": 1,
"IdDistrict": {
"$in": [
25938
]
},
"IdCity": 7994
}
},
{
"$unwind": "$Facets"
},
{
"$sortByCount": "$Facets"
}
])
Этот запрос занял 1070 мс.У меня есть несколько примеров с 10774 мс, и оба использовали IXScan: (
В моей коллекции 9 миллионов документов.
Вот мой журнал из профилировщика из 1 запроса. Запрос использовал IXSCAN, но я прочитал в 1статья (https://lamada.eu/blog/2016/11/08/troubleshooting-mongodb-queries-performance/), что для идеального IXScan нам нужно достичь keysExamined = nReturned = docsExamined.
Глядя на мои результаты, я не получил оптимальный индекс
Как можноЯ улучшаю этот запрос?
{
"op": "command",
"ns": "SonarImovel.Property",
"command": {
"aggregate": "Property",
"pipeline": [
{
"$match": {
"Subtype": {
"$in": [
13
]
},
"IdTransaction": 1,
"IdDistrict": {
"$in": [
25938
]
},
"IdCity": 7994
}
},
{
"$unwind": "$Facets"
},
{
"$sortByCount": "$Facets"
}
],
"cursor": {
},
"$db": "SonarImovel",
"lsid": {
"id": UUID("6698f309-4f40-4b77-92bb-fc2a8a99efba")
}
},
"keysExamined": 2638,
"docsExamined": 2638,
"hasSortStage": true,
"cursorExhausted": true,
"numYield": 71,
"locks": {
"Global": {
"acquireCount": {
"r": NumberLong(146)
}
},
"Database": {
"acquireCount": {
"r": NumberLong(73)
}
},
"Collection": {
"acquireCount": {
"r": NumberLong(73)
}
}
},
"nreturned": 39,
"responseLength": 1707,
"protocol": "op_msg",
"millis": 1070,
"planSummary": "IXSCAN { Subtype: 1, IdCity: 1, IdTransaction: 1,
IdDistrict: 1, SortOrder: 1 }"