2012-06-27 2 views
1

У меня есть коллекция в монго, в которую я вставляю данные из Perl (используя MongoDb) и с mongoinsert. Проблема в том, что типы данных для чисел становятся непоследовательными.Вставка MongoDb (драйвер Perl) против несогласованности mongoimport

Например, из Perl, я:

$collection->insert({ _id => 1, value => "record 1" }); 

и у меня есть JSON-файл, который я импортировать с mongoimport, который содержит следующую строку:

{"_id":2,"value":"record 2"} 

Теперь, если я делаю поиск по коллекции, я получаю:

> db.test.find() 
{ "_id" : NumberLong(1), "value" : "record 1" } 
{ "_id" : 2, "value" : "record 2" } 

Есть ли способ заставить драйвер Perl вставить _i d как 32-битное число? или заставить mongoimport записать его как 64-битный (NumberLong)?

У вас есть другие предложения относительно того, как сохранить поле _id согласованным?

ответ

2
модуль документации

MongoDB Perl имеет некоторую информацию о 64-разрядных целых чисел: размер разницы http://search.cpan.org/dist/MongoDB/lib/MongoDB/DataTypes.pod#64-bit_Platforms

Целое число зависит от языка и используемого драйвера; динамически типизированные языки, такие как Perl, PHP и Python, будут использовать 64-битные целые числа, если они скомпилированы для 64-разрядных и 32-разрядных целых чисел, если они скомпилированы для 32-разрядных. Статически типизированные языки, такие как Java, могут быть более конкретными (Int всегда 32-разрядный), но некоторые языки, такие как C, гарантируют, что int не менее 16 бит (и длиннее больше int и не менее 32 бит).

Ожидается, что NumberLong _ids, которые вы видите в запросе оболочки, вставляете данные с использованием 64-разрядного Perl (который использует 64-разрядные целые числа). 32-разрядные целые числа фактически находятся в формате NumberInt, но оболочка явно не отображает тип для них.

Что касается индексирования и запросов, числовые _ids все равно должны быть уникальными.

Например, пытаясь вставить то же целое _id как и в 32 и 64 бит вызывает дубликат ключа ошибки:

MongoDB shell version: 2.0.6 
>  db.ints.insert({ _id: NumberInt(1) }); 
>  db.ints.insert({ _id: NumberLong(1) }); 
E11000 duplicate key error index: testing.ints.$_id_ dup key: { : 1 } 

, подобным образом, при запросе цифровых _ids будет соответствовать:

>  db.ints.insert({ _id: NumberLong(2) }); 
>  db.ints.find({_id:Number(2)}); 
{ "_id" : NumberLong(2) } 

>  db.ints.insert({ _id: NumberLong(3) }); 
>  db.ints.find({_id:Number(3)}); 
{ "_id" : NumberLong(3) } 

Если вас беспокоит различие в размерах целого с использованием разных драйверов или команд, таких как mongoimport, вы можете написать свой собственный сценарий импорта. Эквивалент mongoimport можно быстро собрать, используя Text::CSV_XS.

+0

Большое спасибо за ваш ответ .. это прояснило для меня ... моя забота заключалась в том, что у меня есть дубликаты документов на _id, а одно из них - 32-битное целое, а другое - 64-битное целое число, и я предположил, что это может быть причиной ... –

 Смежные вопросы

  • Нет связанных вопросов^_^