Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / NoSQL, Big Data Новый топик    Ответить
 Mongo > структура документа  [new]
Ренат
Member

Откуда: Елабуга & Казань & Москва & Набережные челны
Сообщений: 4230
Есть монго коллекция размером 1гб и примерно 6000 документов (товаров).

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

    Как реализовано:
  • добавлена структура вида:
    "stats": {
      "rates": {
        "RU":10,
        "US":8,
        "FR": 32,
        .... еще 200+ стран
      }
    } 
    

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


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


    Добавлять индекс с такой структурой никак, так как для каждой страны тогда надо будет создавать индекс т.е. больше 200 штук.
    Как тогда быть? Может можно поменять структуру чтобы можно было 1им индексом обойтись?
  • 18 окт 18, 11:17    [21707564]     Ответить | Цитировать Сообщить модератору
     Re: Mongo > структура документа  [new]
    alex55555
    Member

    Откуда:
    Сообщений: 2129
    Ренат,

    А зачем в учётной системе эта монга? Обычная БД всё отсортирует и покажет.
    18 окт 18, 12:19    [21707665]     Ответить | Цитировать Сообщить модератору
     Re: Mongo > структура документа  [new]
    Ренат
    Member

    Откуда: Елабуга & Казань & Москва & Набережные челны
    Сообщений: 4230
    Система построена на сервисах.
    Основной сайт не имеет доступ к mysql. Только к сервису который умеет делать запрос к монге.
    Т.е. монга у нас как промежуточный кеш между основным сайтом и mysql базой данных.
    поэтому мы можем юзать только монгу в данном случае
    18 окт 18, 12:24    [21707673]     Ответить | Цитировать Сообщить модератору
     Re: Mongo > структура документа  [new]
    skyANA
    Member

    Откуда: Зеленоград
    Сообщений: 26611
    Ренат,

    если в лоб, то:
    "stats": {
      "rates": [
        { "countryCode": "RU", "rate": 10 },
        { "countryCode": "US", "rate": 8 },
        { "countryCode": "FR", "rate": 32 },
        .... еще 200+ стран
      ]
    }
    
    18 окт 18, 14:00    [21707818]     Ответить | Цитировать Сообщить модератору
     Re: Mongo > структура документа  [new]
    Ренат
    Member

    Откуда: Елабуга & Казань & Москва & Набережные челны
    Сообщений: 4230
    skyANA,

    а в таком случае возможно без aggregate $unwind обойтись? обычным find?
    18 окт 18, 16:13    [21707961]     Ответить | Цитировать Сообщить модератору
     Re: Mongo > структура документа  [new]
    Дмитрий Мух
    Member

    Откуда: Зеленоград
    Сообщений: 2029
    Ренат,

    возможно
    18 окт 18, 21:02    [21708246]     Ответить | Цитировать Сообщить модератору
     Re: Mongo > структура документа  [new]
    Ренат
    Member

    Откуда: Елабуга & Казань & Москва & Набережные челны
    Сообщений: 4230
    что то не получаеться:

    + исходные данные
    {
        "_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}
        ]
    }
    


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

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

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


    + Возращает странный порядок
    {
        "_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}
        ]
    }
    
    19 окт 18, 14:44    [21709205]     Ответить | Цитировать Сообщить модератору
     Re: Mongo > структура документа  [new]
    Ренат
    Member

    Откуда: Елабуга & Казань & Москва & Набережные челны
    Сообщений: 4230
    mongo docs
    When 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
    19 окт 18, 14:58    [21709225]     Ответить | Цитировать Сообщить модератору
     Re: Mongo > структура документа  [new]
    Дмитрий Мух
    Member

    Откуда: Зеленоград
    Сообщений: 2029
    Ренат,

    дайте что-ли пример списка товаров, полную структуру.
    19 окт 18, 18:36    [21709439]     Ответить | Цитировать Сообщить модератору
    Все форумы / NoSQL, Big Data Ответить