2012-01-25 4 views
3

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

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

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

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

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

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

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

ответ

5

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

+1

+1 для рекомендации для хранения денежных значений в виде целых чисел. –

+1

Интересно, сколько производственного кода использует с плавающей запятой для денежных значений;) –

+0

Может быть, вы должны вынуть предложение «нет ориентированного на поддержку десятичного формата», так как mongo и php предлагают собственные десятичные форматы: 'Number' для Mongo (который является по умолчанию для всех литералов чисел) и 'float' для php. Вы должны явно создать MongoInt64 для хранения как NumberLong в php (целочисленный формат в mongo). http://www.mongodb.org/display/DOCS/Data+Types+and+Conventions –

3

Посмотрите, что $_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.

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

5

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

Способ, которым я мог производить десятичные числа в монго, был фактически сохранением значений как 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) } 
> 
Смежные вопросы