Нужен совет тех, кто работал с 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 для такой задачи?