Гость
Форумы / NoSQL, Big Data [игнор отключен] [закрыт для гостей] / Mongo > структура документа / 9 сообщений из 9, страница 1 из 1
18.10.2018, 11:17
    #39719270
Ренат
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mongo > структура документа
Есть монго коллекция размером 1гб и примерно 6000 документов (товаров).

Довольно простая задача:
для каждой страны выводить список самых покупаемых товаров

Как реализовано:

добавлена структура вида:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
"stats": {
  "rates": {
    "RU":10,
    "US":8,
    "FR": 32,
    .... еще 200+ стран
  }
} 



при запросе к монге используем сортировку:mongofind(...).sort({"stats.rates.<country_code>":-1})

Проблема:

на 3ей странице mongoskip(200).limit(100) уже получаем ошибку: mongotoo much data for sort() with no index. add an index or specify a smaller limit

Добавлять индекс с такой структурой никак, так как для каждой страны тогда надо будет создавать индекс т.е. больше 200 штук.
Как тогда быть? Может можно поменять структуру чтобы можно было 1им индексом обойтись?
...
Рейтинг: 0 / 0
18.10.2018, 12:19
    #39719293
alex55555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mongo > структура документа
Ренат,

А зачем в учётной системе эта монга? Обычная БД всё отсортирует и покажет.
...
Рейтинг: 0 / 0
18.10.2018, 12:24
    #39719296
Ренат
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mongo > структура документа
Система построена на сервисах.
Основной сайт не имеет доступ к mysql. Только к сервису который умеет делать запрос к монге.
Т.е. монга у нас как промежуточный кеш между основным сайтом и mysql базой данных.
поэтому мы можем юзать только монгу в данном случае
...
Рейтинг: 0 / 0
18.10.2018, 14:00
    #39719381
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mongo > структура документа
Ренат,

если в лоб, то:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
"stats": {
  "rates": [
    { "countryCode": "RU", "rate": 10 },
    { "countryCode": "US", "rate": 8 },
    { "countryCode": "FR", "rate": 32 },
    .... еще 200+ стран
  ]
}
...
Рейтинг: 0 / 0
18.10.2018, 16:13
    #39719469
Ренат
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mongo > структура документа
skyANA,

а в таком случае возможно без aggregate $unwind обойтись? обычным find?
...
Рейтинг: 0 / 0
18.10.2018, 21:02
    #39719581
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mongo > структура документа
Ренат,

возможно
...
Рейтинг: 0 / 0
19.10.2018, 14:44
    #39719994
Ренат
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mongo > структура документа
что то не получаеться:

исходные данные
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
{
    "_id" : 1,
    "stats" : [ 
        {"code" : "RU","rate" : 11}, 
        {"code" : "CZ","rate" : 11}, 
        {"code" : "US","rate" : 11}
    ]
},
{
    "_id" : 2,
    "stats" : [ 
        {"code" : "RU","rate" : 12}, 
        {"code" : "CZ","rate" : 12}, 
        {"code" : "US","rate" : 12}
    ]
},
{
    "_id" : 3,
    "stats" : [ 
        {"code" : "RU","rate" : 13}, 
        {"code" : "CZ","rate" : 13}, 
        {"code" : "US","rate" : 13}
    ]
},
{
    "_id" : 4,
    "stats" : [ 
        {"code" : "RU","rate" : 9}, 
        {"code" : "CZ","rate" : 9}, 
        {"code" : "US","rate" : 9}
    ]
},
{
    "_id" : 5,
    "stats" : [ 
        {"code" : "RU","rate" : 1}, 
        {"code" : "CZ","rate" : 10}, 
        {"code" : "US","rate" : 20}
    ]
},
{
    "_id" : 6,
    "stats" : [ 
        {"code" : "RU","rate" : 20}, 
        {"code" : "CZ","rate" : 15}, 
        {"code" : "US","rate" : 1}
    ]
}



Пробовал так:
Код: javascript
1.
2.
3.
db.contents.
   find({"stats":{$elemMatch:{"code":"RU"}}}).
   sort({"stats.$.rate":1})


Сортировка не работает.

Пробовал так:
Код: javascript
1.
2.
3.
db.contents.
   find({"stats":{$elemMatch:{"code":"RU"}}},{"stats.$":1}).
   sort({"stats.rate":1})



Возращает странный порядок
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
{
    "_id" : 5,
    "stats" : [ 
        {"code" : "RU","rate" : 1}
    ]
},
{
    "_id" : 6,
    "stats" : [ 
        {"code" : "RU","rate" : 20}
    ]
},
{
    "_id" : 4,
    "stats" : [ 
        {"code" : "RU","rate" : 9}
    ]
},
{
    "_id" : 1,
    "stats" : [ 
        {"code" : "RU","rate" : 11}
    ]
},
{
    "_id" : 2,
    "stats" : [ 
        {"code" : "RU","rate" : 12}
    ]
},
{
    "_id" : 3,
    "stats" : [ 
        {"code" : "RU","rate" : 13}
    ]
}

...
Рейтинг: 0 / 0
19.10.2018, 14:58
    #39720005
Ренат
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mongo > структура документа
mongo docsWhen the find() method includes a sort(), the find() method applies the sort() to order the matching documents before it applies the positional $ projection operator.

If an array field contains multiple documents with the same field name and the find() method includes a sort() on that repeating field, the returned documents may not reflect the sort order because the sort was applied to the elements of the array before the $ projection operator.
Нашел монго документации.
Пока не понятно как сделать это обычным find
...
Рейтинг: 0 / 0
19.10.2018, 18:36
    #39720130
Дмитрий Мух
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Mongo > структура документа
Ренат,

дайте что-ли пример списка товаров, полную структуру.
...
Рейтинг: 0 / 0
Форумы / NoSQL, Big Data [игнор отключен] [закрыт для гостей] / Mongo > структура документа / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]