Mongodb PHP – Целые числа с десятичными знаками

Это последует за другим сообщением о вводе целого числа в mongodb. У меня это работает просто отлично, используя (int), но теперь, когда он вставляет число в db, он разбивает все после десятичной. Так что, если бы я имел 154.65, он был бы вставлен в mongodb как 154 без ничего после десятичного числа.

Мой вопрос в том, как я могу заставить это сохранить все числа после десятичного числа? Кроме того, если кто-то имеет ссылку на эти жало / числовые функции, я был бы признателен за ссылку. Благодарю.

$number["xyz"] = (int) $_POST["number"] ; $collection->insert($number); 

Это вставляет его как целое число, но разделяет все после десятичной. Я попробовал вам предложение

 $number["xyz"] = floatval($_POST["number"]) ; $collection->insert($number); 

но это все равно отбрасывает все после десятичной дроби. Мой, хотя мне нужно что-то похожее на то, чтобы оно было в формате mongo:

 $number["xyz"] = (dec) $_POST["number"] ; $collection->insert($number); 

Нет основанного на принципе десятичного формата. Ваши параметры – это плавающая запятая (cast перед ее сохранением), integer (что приводит к удалению десятичных знаков по мере того, как вы видите) или строку (листинг до ее сохранения). Оптимальный выбор зависит от ваших функциональных требований. Например, если это денежное значение, вы не хотите использовать float, но сохраняете значение в центах как целое число (15465 в вашем примере).

Я попытаюсь расчистить это для вас, ребята, потому что это немного пошатнулось, пытаясь отсортировать цены в списках категорий продуктов.

То, как я смог произвести десятичные числа в монго, фактически состояло в том, чтобы хранить значения как float.

Вы также можете вставить как центы с int или MongoInt64 (делятся на 100, чтобы вернуться к долларам). Вот мой код вставки / импорта, используя класс mongo php.

 $m = new Mongo(); $db = $m->selectDB("test"); $collection = new MongoCollection($db, 'numInt'); $collection2 = new MongoCollection($db, 'numFloat'); $collection3 = new MongoCollection($db, 'numLong'); $collection->insert(array('Integer' => (int)123.54));//I tried a decimal just to see...nope...gets cut off $collection->insert(array('Integer' => (int)54321)); $collection->insert(array('Integer' => (int)12345)); $collection2->insert(array('Float' => (float)12354)); $collection2->insert(array('Float' => (float)54321)); $collection2->insert(array('Float' => (float)123.45));//*********This was stored as decimal in database results $collection3->insert(array('Mongo64'=>new MongoInt64('54234.45')));//I tried a decimal just to see...nope...gets cut off $collection3->insert(array('Mongo64'=>new MongoInt64('75432'))); $collection3->insert(array('Mongo64'=>new MongoInt64('12345'))); //results //first example int and MongoInt64 (NumberLong in PHP) ***sorted ascending echo "<strong>Integer Example</strong><br /> --------------------<br />"; $cursor = $collection->find(); $cursor->sort(array('Integer'=>1)); foreach($cursor as $obj){ echo ($obj['Integer']/100)."<br />"; } echo "<br />"; //second example float ***sorted ascending echo "<strong>Float Example</strong><br /> ----------------------------<br />"; $cursor2 = $collection2->find(); $cursor2->sort(array('Float'=>1)); foreach($cursor2 as $obj){ echo ($obj['Float']/100)."<br />"; } echo "<br />"; //third example float ***sorted ascending echo "<strong>Number Long (MongoInt64) Example</strong><br /> ------------------------------<br />"; $cursor3 = $collection3->find(); $cursor3->sort(array('Mongo64'=>1)); foreach($cursor3 as $obj){ echo ($obj['Mongo64']/100)."<br />"; } 

Это результат кода php, который я опубликовал выше ….

 Integer Example -------------------- 1.23 123.45 543.21 Float Example ---------------------------- 1.2345 123.54 543.21 Number Long (MongoInt64) Example ------------------------------ 123.45 542.34 754.32 

Здесь были результаты поиска () для каждой из коллекций в оболочке монго

 > db.numInt.find() { "_id" : ObjectId("50a322508c85671a2b000000"), "Integer" : 123 } { "_id" : ObjectId("50a322508c85671a2b000001"), "Integer" : 54321 } { "_id" : ObjectId("50a322508c85671a2b000002"), "Integer" : 12345 } > db.numFloat.find() { "_id" : ObjectId("50a322508c85671a2b000003"), "Float" : 12354 } { "_id" : ObjectId("50a322508c85671a2b000004"), "Float" : 54321 } { "_id" : ObjectId("50a322508c85671a2b000005"), "Float" : 123.45 } > db.numLong.find() { "_id" : ObjectId("50a322508c85671a2b000006"), "Mongo64" : NumberLong(54234) } { "_id" : ObjectId("50a322508c85671a2b000007"), "Mongo64" : NumberLong(75432) } { "_id" : ObjectId("50a322508c85671a2b000008"), "Mongo64" : NumberLong(12345) } > 

Посмотрите, что $_POST["number"]; на самом деле дает вам возможность распечатать его. У меня такое чувство, что ваша проблема кроется во входе. Все они работают так, как ожидалось:

 $collection->insert(array("test"=>"a","float"=>123.45)); $collection->insert(array("test"=>"b","float"=>floatval("123.45"))); $test = array("test"=>"c","float"=>123.45); $collection->insert($test); 

результаты:

 db.test.find(); { "_id" : ObjectId("4f2036a6eabc88dd0e000006"), "test" : "a", "float" : 123.45 } { "_id" : ObjectId("4f2036a6eabc88dd0e000007"), "test" : "b", "float" : 123.45 } { "_id" : ObjectId("4f2036a6eabc88dd0e000008"), "test" : "c", "float" : 123.45 } 

Добавление еще нескольких примеров для целых чисел:

 $collection->insert(array("test"=>"inta","int"=>new MongoInt32("12345"))); $collection->insert(array("test"=>"intb","int"=>new MongoInt64("123456789"))); 

приводит к (по крайней мере, в моей системе):

 { "_id" : ObjectId("4f20431feabc88cf3500001b"), "test" : "inta", "int" : 12345 } { "_id" : ObjectId("4f20431feabc88cf3500001c"), "test" : "intb", "int" : NumberLong(123456789) } 

Итак, вы должны быть несколько осторожны, если хотите хранить числа как «реальные целые числа» в mongodb.

Обновление. Я был исправлен кем-то из 10gen в том, что целые числа PHP обычно хранятся как целые числа в монго, даже если тип в оболочке показывает Number. Существует также настройка для PHP-драйвера mongo, которая позволяет вам указать это поведение «native_long». http://php.net/manual/en/mongo.configuration.php