Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Числа из PHP в MongoDB

Не знал, что официальный драйвер Монги для ПХП передаёт числа в Монгу как строки.

Долго не понимал почему удаление строк из коллекции срабатывает почти сразу, а не через заданное время. Наконец, догадался посмотреть на получившийся индекс, оказалалось, что все числа там — строки (в том числе и период через который значения удаляются).

А чтобы получились числа их надо завернуть в специальный объект:

$mongo->ensureIndex([
    'date' => new MongoInt32(1)
], [
    'expireAfterSeconds' => new MongoInt32(7200)
]);

Вот как выглядит правильный индекс:

Правильный индекс (12.97КиБ)

В неправильном числа будут окружены апострофами.

11 комментариев
smikera 2013

А как же ты раньше писал запросы? Там же с числами в данных та же петрушка — если в документе лежит число, то по переданной в запросе строке он не будет найден.

Евгений Степанищев (bolknote.ru) 2013

Комментарий для smikera:

Какие запросы? Видно же, что сессия хранится. Там один запрос — по ID сессии, а это строка.

Clops 2013

Обычно хватает простого cast to int: ’foo’ => (int)$bar

Евгений Степанищев (bolknote.ru) 2013

Комментарий для Clops:

Вы посмотрите на код-то. Там уже числа. Зачем ещё typecast?

clops 2013

MongoDB 2.4.4, Driver 1.3.6 -​-​> сохраняет числа как числа, а строки как строки. Имхо MongoInt32 и MongoInt64 — это специальные классы для сохранения целых чисел на 64 и 32 битных системах соответственно.

Евгений Степанищев (bolknote.ru) 2013

Комментарий для clops:

У нас PHP 5.4.19, MongoDB 2.4.6, драйвер 1.4.2, работает именно так, как я описал.

gogis 2013

Делаю всегда (int)$var. По дефолту действительно строка, что настораживает.
В итоге я писал рекурсивную обертку для массивов, где все is_numeric кастились в int/float.

gogis 2013

Жень, будете на 5.5 переходить или будешь его щупать — напиши. Мне пока сыкотно :)

gogis 2013

Кстати я видел что ты негативно отзывался (и не ты один) о монге давеча, что то поменялось?
У нас монга уже полтора года, буквально три месяца назад я обновил сервера, сделал реплику мастер-слейв. Две железяки, арбитр на одном из серверов.
Сейчас мы будем туда писать достаточно критичные данные (фид для сборной солянки контента) а до этого там хранились пользовательские настройки (~ 25 миллионов уников)
По mongostats сейчас примерно 50 апдейтов в секунду (все с write concern 1), чтений в десятки раз больше (ах да, забыл сказать, это sports.ru) и в принципе у нас за весь период проблем не было. Я тестировал кейсы с вырубанием одного из серверов, все как часы.

Я рассматривал другие nosql альтернативы, но там даже близко нет ничего сравнимого по возможностям с aggregate framework и все эти возможности я щас активно использую. Если честно, я реально не понимаю всего негатива в сторону монго. Тем более что негатив связан с тем, что легко настроить (типа того что в ранних версиях write concern был по дефолту в ноль)

Евгений Степанищев (bolknote.ru) 2013

Комментарий для gogis:

Жень, будете на 5.5 переходить или будешь его щупать — напиши. Мне пока сыкотно :)

На продакшне до конца года не будем.

Кстати я видел что ты негативно отзывался (и не ты один) о монге давеча, что то поменялось?

Ничего не поменялось. Я по-прежнему к ней плохо отношусь из-за:

1) того что она иногда «разваливается» и не поднимается автоматически обратно.
2) блокирует всю коллекцию на запись.

В остальном у меня претензий нет. Тем не менее, мы её используем для сессий (мы тогда о ней мало знали, теперь я знаю, что это плохой выбор) и для поиска (хороший атрибутивный поиск с индексами, вроде рабочий полнотекстовый).

PLU 2013

спасибо за статью, также советую статью по теме http://plutov.by/post/mongodb_counters