将长整型值导入到mongodb

7

如何使用 mongoimport 导入 NumberLong 到 MongoDB?

不幸的是,json 文件中这样的条目会导致错误:

{"_id": NumberLong(123)}
{"_id": NumberLong("123")}

结果:

Mon Nov 12 14:41:46 Assertion: 10340:Failure parsing JSON string near: "_id": Num
0xaf6b21 0xabe459 0xabe5dc 0x7b93ad 0x56160d 0x5630f4 0xabb412 0x5546bc 0x7f961b79776d 0x554549 
 mongoimport(_ZN5mongo15printStackTraceERSo+0x21) [0xaf6b21]
 mongoimport(_ZN5mongo11msgassertedEiPKc+0x99) [0xabe459]
 mongoimport() [0xabe5dc]
 mongoimport(_ZN5mongo8fromjsonEPKcPi+0x56d) [0x7b93ad]
 mongoimport(_ZN6Import8parseRowEPSiRN5mongo7BSONObjERi+0xa2d) [0x56160d]
 mongoimport(_ZN6Import3runEv+0x1314) [0x5630f4]
 mongoimport(_ZN5mongo4Tool4mainEiPPc+0x1712) [0xabb412]
 mongoimport(main+0x2c) [0x5546bc]
 /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed) [0x7f961b79776d]
 mongoimport(__gxx_personality_v0+0x419) [0x554549]
Mon Nov 12 14:41:46 exception:BSON representation of supplied JSON is too large: Failure parsing JSON string near: "_id": Num
Mon Nov 12 14:41:46 
Mon Nov 12 14:41:46 imported 0 objects
Mon Nov 12 14:41:46 ERROR: encountered 1 error
3个回答

3

NumberLong是Javascript Shell的一个输出,用于显示MongoDB已经存储了64位整数。对于导入操作,您可以直接使用以下命令:

{ "_id": 123 }

它将自动使用普通数字(int32)或者如果太大,使用NumberLong(int64)。在MongoDB中进行操作时,无论它是作为int32还是int64存储都无关紧要。


1
问题在于Mongo实际上会在数据库中保留值的类型。当我从Java应用程序保存一个Long值并在之后从数据库中读取它时,即使这个数字适合普通的Integer,Mongo仍然会返回一个Long。但是当我像你建议的那样导入我的数据时,Mongo将不会将其保存为NumberLong,应用程序将得到一个Integer,反过来会出现一个很好的类转换异常。 - ghik
这是你需要在应用程序中处理的事情,以便它既接受Int又接受Long。对于PHP,我们需要添加一些选项来实现这一点:http://derickrethans.nl/64bit-ints-in-mongodb.html - Derick

0
如果您使用了 mongodump,那么您需要使用 mongorestore。我不小心在一个由 mongodump 生成的文件上输入了 mongoimport。这将会失败并显示类似以下的信息:
Wed Jan  9 16:47:23 exception:BSON representation of supplied JSON is too large: Failure parsing JSON string near: <h2></h2>
Wed Jan  9 16:47:23 
Wed Jan  9 16:47:23 Assertion: 10340:Failure parsing JSON string near: <h3>The He
0xafda51 0xac5399 0xac551c 0x7bbecd 0x561a8d 0x563574 0xac1b8b 0x554b3c 0x3b9801ecdd 0x5549c9 
 mongoimport(_ZN5mongo15printStackTraceERSo+0x21) [0xafda51]
 mongoimport(_ZN5mongo11msgassertedEiPKc+0x99) [0xac5399]
 mongoimport() [0xac551c]
 mongoimport(_ZN5mongo8fromjsonEPKcPi+0x56d) [0x7bbecd]
 mongoimport(_ZN6Import8parseRowEPSiRN5mongo7BSONObjERi+0xa2d) [0x561a8d]
 mongoimport(_ZN6Import3runEv+0x1314) [0x563574]
 mongoimport(_ZN5mongo4Tool4mainEiPPc+0x16cb) [0xac1b8b]
 mongoimport(main+0x2c) [0x554b3c]
 /lib64/libc.so.6(__libc_start_main+0xfd) [0x3b9801ecdd]
 mongoimport(_
_gxx_personality_v0+0x419) [0x5549c9]

这不是您所期望的响应,因此请注意如何移动Mongo中的数据。


0

这可能有点老,但位置很好 :)

我有一些mongo数据,我绝对必须导入。ISODate和NumberLong必须被它们的mongo内部等效替换。所以我做了这个:

perl -ape 'BEGIN {$\=""} s/ISODate\((.*)\)/ { "\$date": $1 }/g; s/NumberLong\(\s*\"?(\d+)\"?\s*\)/ { "\$numberLong" : \"$1\" }/g; chop' data.json > data2.json

这个被顺利地吞咽了:

mongoimport --db mydb --collection mycoll   --file data2.json  --jsonArray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接