Числа из PHP в MongoDB
Не знал, что официальный драйвер Монги для ПХП передаёт числа в Монгу как строки.
Долго не понимал почему удаление строк из коллекции срабатывает почти сразу, а не через заданное время. Наконец, догадался посмотреть на получившийся индекс, оказалалось, что все числа там — строки (в том числе и период через который значения удаляются).
А чтобы получились числа их надо завернуть в специальный объект:
$mongo->ensureIndex([
'date' => new MongoInt32(1)
], [
'expireAfterSeconds' => new MongoInt32(7200)
]);
Вот как выглядит правильный индекс:
В неправильном числа будут окружены апострофами.
А как же ты раньше писал запросы? Там же с числами в данных та же петрушка — если в документе лежит число, то по переданной в запросе строке он не будет найден.
Комментарий для smikera:
Какие запросы? Видно же, что сессия хранится. Там один запрос — по ID сессии, а это строка.
Обычно хватает простого cast to int: ’foo’ => (int)$bar
Комментарий для Clops:
Вы посмотрите на код-то. Там уже числа. Зачем ещё typecast?
MongoDB 2.4.4, Driver 1.3.6 --> сохраняет числа как числа, а строки как строки. Имхо MongoInt32 и MongoInt64 — это специальные классы для сохранения целых чисел на 64 и 32 битных системах соответственно.
Комментарий для clops:
У нас PHP 5.4.19, MongoDB 2.4.6, драйвер 1.4.2, работает именно так, как я описал.
Делаю всегда (int)$var. По дефолту действительно строка, что настораживает.
В итоге я писал рекурсивную обертку для массивов, где все is_numeric кастились в int/float.
Жень, будете на 5.5 переходить или будешь его щупать — напиши. Мне пока сыкотно :)
Кстати я видел что ты негативно отзывался (и не ты один) о монге давеча, что то поменялось?
У нас монга уже полтора года, буквально три месяца назад я обновил сервера, сделал реплику мастер-слейв. Две железяки, арбитр на одном из серверов.
Сейчас мы будем туда писать достаточно критичные данные (фид для сборной солянки контента) а до этого там хранились пользовательские настройки (~ 25 миллионов уников)
По mongostats сейчас примерно 50 апдейтов в секунду (все с write concern 1), чтений в десятки раз больше (ах да, забыл сказать, это sports.ru) и в принципе у нас за весь период проблем не было. Я тестировал кейсы с вырубанием одного из серверов, все как часы.
Я рассматривал другие nosql альтернативы, но там даже близко нет ничего сравнимого по возможностям с aggregate framework и все эти возможности я щас активно использую. Если честно, я реально не понимаю всего негатива в сторону монго. Тем более что негатив связан с тем, что легко настроить (типа того что в ранних версиях write concern был по дефолту в ноль)
Комментарий для gogis:
На продакшне до конца года не будем.
Ничего не поменялось. Я по-прежнему к ней плохо отношусь из-за:
1) того что она иногда «разваливается» и не поднимается автоматически обратно.
2) блокирует всю коллекцию на запись.
В остальном у меня претензий нет. Тем не менее, мы её используем для сессий (мы тогда о ней мало знали, теперь я знаю, что это плохой выбор) и для поиска (хороший атрибутивный поиск с индексами, вроде рабочий полнотекстовый).
спасибо за статью, также советую статью по теме http://plutov.by/post/mongodb_counters