Mongodb — поиск по многим критериям

Нужен совет тех, кто работал с MongoDB:
Допустим есть данные такого вида:
{
	a: {
		id:1,
		id2:3
	},	
	b: [ "str1", "str2", "str3" ],
	c: [ 
		{f:"UA", g:12, s:"some string"},
		{f:"RU", g:1, s:"some string2"}
	 ],
	d: [ 
		{f:"UA", g:2, s:"some string3"},
		{f:"UA", g:2, s:"some string4"}
	 ],
	dtF: ISODate("2012-04-25T21:00:00Z"),
	dtT: ISODate("2012-04-28T21:00:00Z"),
	cc: true,
	m: 0,
	v: 32,
	...
}


В коллекции около 3М записей.

Необходимо производить поиск по этой коллекции по разным полям, т.е. в одном запросе могут участвовать все поля в другом только несколько.

Примеры запросов:

{ "c.f" : "UA" , "d.f" : "UA" , "c.s":{"$regex":"some", "$options" : ""}} 


{ "c.f" : "UA" , "d.f" : "UA" , "c.g" : { "$in" : [ 17]}, "b":{"$nin":["str1"]} 


{ "m" : { "$gte" : 2 , "$lte" : 7} , "v" : { "$lte" : 50} , "c.f" : "UA" , "d.f" : "UA" , "c.g" : { "$in" : [ 27]}}


{"m" : { "$lte":20} , "v" : { "$lte" : 8},"c.f":"UA","c.g":{"$in":[1,12,16]}, "c.s":{"$regex":"some", "$options" : ""},"d.f":"RU","d.g":{"$in":[25,16]}, "d.s":{"$regex":"some2", "$options" : ""},cc:false, "$or" : [ { "dtF" : { "$gte" : { "$date" : "2012-05-06T21:00:00.000Z"}} , "dtT" :  null } , { "dtF" : { "$gte" : { "$date" : "2012-05-06T21:00:00.000Z"}} , "dtT" : { "$lte" : { "$date" : "2012-06-06T21:00:00.000Z"}}}], "b":{"$in":["str1"]}}


Проблемы которые вижу:
— Сложно сделать «индекс на запрос», т.к. разных вариантов запросов может быть много
— Нельзя создать составной индекс, включающий несколько «полей-массивов»
— Чем больше индексов, тем меньше скорость записи.

Что посоветуете? Подходит ли MongoDB для такой задачи?
  • Вопрос задан
  • 4297 просмотров
Пригласить эксперта
Ответы на вопрос 1
maratfmu
@maratfmu
Советую взять выборку полей самых популярных запросов и на основании этих полей построить для каждого запроса свой индекс. Решит проблему производительности на 80%
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы