Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Веб-программирование > Общее

Общее Веб-разработка в целом, идеи, проекты...

Ответ
 
Опции темы
Старый 18.06.2013, 10:02   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,247 пользователей)
MongoDB

Наверное буду время от времени задавать по ней вопросы...

Первый вопрос: Как оптимальнее перезаписать поле у всех записей таблицы? Хочу сбросить счетчик начисленного за неделю или за день опыта. Вообще если есть интересные мысли по организации такого топа то тоже прошу высказывать.

Заранее спасибо!
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 18.06.2013, 11:12   #2
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: MongoDB

Сообщение от pax Посмотреть сообщение
Наверное буду время от времени задавать по ней вопросы...
Какой драйвер используешь (язык)?

Сообщение от pax Посмотреть сообщение
Первый вопрос: Как оптимальнее перезаписать поле у всех записей таблицы? Хочу сбросить счетчик начисленного за неделю или за день опыта.
db.characters.update({ }, { $set: { experience} }, { multitrue }); 
Это примениться ко всем персонажам в бд. Установит experience на нуль. multi - нужен чтобы сообщить бд чтобы обновил все записи подходящие под фильр (в данном случае все т.к. фильтр пуст). По стандарту без multi обновляется только первая найденная запись.

Сообщение от pax Посмотреть сообщение
Вообще если есть интересные мысли по организации такого топа то тоже прошу высказывать.
На самом деле нам нужен раздел на форуме "Базы Данных", который будет покрывать все бд. Т.к. и по SQL'у было не мало вопросов.

И раздел "Web" не подходящий имхо, т.к. тут бд как угодно можно юзать.

ЗЫ, сам юзаю mongodb для проекта сейчас (по работе), используем 2dsphere индексацию для гео-кординат, крутая штука.

Советую также изучить как работают индексы, и тестировать запросы с использованием .explain() метода, чтобы посмотреть сколько времени запрос занял, какие индексы юзает и сколько листает и выдаёт записей.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (18.06.2013)
Старый 18.06.2013, 11:36   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,247 пользователей)
Ответ: MongoDB

Спасибо, сделал так же за исключением первого условия. Передам пустой массив. Язык PHP но это роли не играет особой. Про explain спасибо, возьму на заметку.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 18.06.2013, 12:26   #4
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: MongoDB

Для оптимизации, проиндексируй collection по experience полю.
Далее в запросе можешь фильтровать:
db.characters.update({ experience: { $gt} }, { $set: { experience} }, { multitrue }); 
Таким образом будут пролистываться только те документы, которые имеют какой либо опыт.
Для того чтобы убедиться в индексе, пропиши:
db.characters.find({ experience: { $gt} }).explain(); 
Должен указать какой индекс использовал, и сколько объектов пролистал (nscanned).


Далее попробуй так:
db.characters.find({ experience: { $gt} }).hint({ $natural}).explain(); 
Используя .hint({ $natural: 1 }) query проигнорирует какие либо индексы, и покажет данные запроса без индексации, разница должна быть на лицо.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (18.06.2013)
Старый 18.06.2013, 12:36   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,247 пользователей)
Ответ: MongoDB

Индекс там уже есть, а вот условие первое я значит зря убрал)
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 18.06.2013, 12:43   #6
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: MongoDB

Учти что если в фильтре больше одного условия, то индексы не совмещаются, бд выберет тот что считает наиболее подходящий. Можно иметь compound index, который совмещает разные поля (последовательность важна).
Также можно используя .hint() намеренно указать определённый index который ты хочешь использовать для query.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (18.06.2013)
Старый 18.06.2013, 13:03   #7
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,247 пользователей)
Ответ: MongoDB

У меня условие было 1:1 твое)
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
moka (18.06.2013)
Старый 21.06.2013, 08:04   #8
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,247 пользователей)
Ответ: MongoDB

Еще одна задача: Хочется выводить игроку его примерное место среди всех игроков по какому-то параметру. Как бы это лучше провернуть? Из мыслей было сделать на каждый параметр запись в отдельную таблицу со всеми игроками сразу... т.е. получить сразу всю таблицу отсортированную в php, присвоить номера и записать в одну запись как массив. Потом делать по ней поиск. Но чет думаю может не правильно... Если игроков будет пару миллионов к примеру, то как такой скрипт отработает?
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 21.06.2013, 10:35   #9
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: MongoDB

Кешировать такие данные, будет в разы эфективнее, нежели запрашивать их каждый раз.
Чтобы получить их, тебе нужно посчитать число записей, у которых значение выше того что ты запрашиваешь. Например у тебя есть 5 записей, со значением фрагов: 2, 5, 7, 9, 15. Тебе нужно найти на каком месте находиться игрок с 9 фрагами:
db.players.find({ frags: { $gte} }).count() 
Получишь число, которое является позицией с верху относительно всех записей игроков в бд. Если нужен процент от топа, тут всё просто
(total position) / total 
Индекс по полю которому ищешь - очень улучшит ситуацию.
Но count это всё равно O(n) операция, следственно если ты запрашиваешь из 10к игроков кого-то с серидины, то бд нужно пролистать 5к игроков, чтобы их посчитать.. Даже с индексом, это всё равно относительно долго.

Следственно имей отдельную collection позиций, и там всё очень тупо:
_id, timestamp, frags
Где _id будет такой же как и _id в collection самих player, timestamp - когда запись была обновлена в последний раз и frags - будет уже высчитанная позиция.
И если запрашиваются данные о позиции, грузи их, если их нету или они устарели (я бы раз в день обновлял), то обнови, и выдай.
Если же тебе нужны эти данные не по запросу а всегда, то тебе нужен cron job, что будет это делать периодически.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (10.07.2013)
Старый 21.06.2013, 15:16   #10
jimon
 
Сообщений: n/a
Ответ: MongoDB

таблица рейтинга это хеш мап с ключем = очки, а место там это индекс бокса в который value попадет
проще чтобы сервер это хранил отдельно от монги, не уверен чтобы именно индекс бокса можно у монги получить, хотя внутри думаю всё и так на хешмапах
 
Ответить с цитированием
Старый 21.06.2013, 16:56   #11
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: MongoDB

Внутри всё хешиться и весьма отлично. А вот про индекс, тут нет.
Получить позицию индекса нельзя, т.к. это не будет работать в случае с шардами баз данных, т.к. каждая из них будет иметь свой список хешей, и не будет знать о чужих списках, следственно посчитать позицию индекса не сможет. А большой упор в монго - это как раз шардинг.
Поэтому это лежит на плечах самих разработчиков.

Конечно можно иметь отдельный процесс, например мелкий node.js, в 50 строк. При запуске он будет загружать все данные и создавать все списки в памяти и их сортировать, затем периодически обновлять, и используя например ZeroMQ можно получать данные какие нужно от другого процесса, PHP или т.п.

Делать подобного рода процесс в бд, я бы не стал, т.к. это semi-realtime данные, и оперировать и обновлять их будет в разы эфективнее в памяти на не в бд.
(Offline)
 
Ответить с цитированием
Старый 19.07.2013, 17:09   #12
goplanb
AnyKey`щик
 
Регистрация: 19.07.2013
Сообщений: 5
Написано 0 полезных сообщений
(для 0 пользователей)
нужен специалист по Mongobd помогите плиззб я делаю лабораторную работу, к информатике не имею ни какого отношения, что описано в этой функции

а что описывает это действие

и это
Миниатюры
Нажмите на изображение для увеличения
Название: CIMG8753.JPG
Просмотров: 198
Размер:	370.2 Кб
ID:	19381  Нажмите на изображение для увеличения
Название: CIMG8760.JPG
Просмотров: 203
Размер:	307.8 Кб
ID:	19382  Нажмите на изображение для увеличения
Название: CIMG8761.JPG
Просмотров: 191
Размер:	275.1 Кб
ID:	19383  
(Offline)
 
Ответить с цитированием
Старый 19.07.2013, 17:43   #13
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: MongoDB

Инфа по MapReduce тут: http://docs.mongodb.org/manual/core/map-reduce/
Вырванные методы из контекста - мало чего говорят.
(Offline)
 
Ответить с цитированием
Старый 19.07.2013, 18:31   #14
goplanb
AnyKey`щик
 
Регистрация: 19.07.2013
Сообщений: 5
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: MongoDB

Сообщение от moka Посмотреть сообщение
Инфа по MapReduce тут: http://docs.mongodb.org/manual/core/map-reduce/
Вырванные методы из контекста - мало чего говорят.
Мне надо 2-3 преддожения на самом приметимном уровне
(Offline)
 
Ответить с цитированием
Старый 19.07.2013, 18:39   #15
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: MongoDB

Запрос листает все закупки от разных пользователей, и подсчитывает сколько покупок сделал каждый пользователь и сколько средняя арифметическая стоимость всех покупок по каждому пользователю.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 06:50.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com