我在 MongoDB 中有相当复杂的数据结构。我的自定义数组由项目 + 长度字段表示(这是另一个故事,为什么 JSON 数组在我的特定情况下不起作用)。保存和更新长度字段的代码是通用的,并且始终提供整数,而不是 float 或 double 。长度字段的值一直是 32 位整数,直到昨天我未能将其中一个转换为 int32,因为它实际上是 double。
所以我有一个有问题的文档(所有相同的层次结构)和其他数千个文档。首先,我将它导出到 JSON。有问题的字段的值为 56,在 JSON 中它看起来像:
...
"55": {
...
},
"Length": 56
},
...
然后我将该 JSON 导入本地 MongoDB 服务器进行调查,当我在 C# 驱动程序中获得该长度字段时,它的类型再次为 double。同一文档中的其他长度字段是整数。这让我怀疑 C# 驱动程序有这种讨厌的行为。要分离 MongoDB 服务器和 C# 驱动程序,我需要在 MongoDB 服务器中检查此值类型,但我不知道如何操作。尝试
typeof db.collection.findOne({...}, {"path.to.value": 1}).path.to.value
为我的所有长度值打印 number。但我不相信这里的 MongoDB,因为简单的测试:
db.test.save({fint: NumberInt(0)})
typeof db.test.findOne().fint
也打印number。
根据 MongoDB BSON Types内部类型是 double 和整数,只有在 MongoDB Shell 中它们看起来像 number。
现在,主要问题是您是否见过类似的东西或知道哪里出了问题?
还有更具体的问题:如何检查值的确切内部数据类型?
MongoDB 2.4.6,C# 驱动程序 1.8.1,在 Windows 和 Linux 上可见
更新
问题出在完全不同的地方。我对从 JSON(通过 JavaScript)导入文档使所有数字成为 double MongoDB 内部类型这一事实感到困惑。接受的答案帮助我发现了这一点。
最佳答案
首先 - JavaScript(MongoDB shell)不区分 double 和 int 数字类型,因此您无法使用 MongoDB shell 进行检查:
typeof 1 === typeof 1.1 // true
您可以执行使用 $type 的查询运算符按类型查询字段:
// 1 for double, 16 for int32, 18 for int64
db.myColl.find({ fint : { $type : 1 } });
使用 GUI 客户端(如 robomongo 或 MongoVUE)可能更容易查看字段类型。
我知道您使用的是 C# 驱动程序,但这也许可以让您了解发生了什么; perl 驱动程序 documentation描述使用 32/64 位整数时与数字的区别:
- Programmer 1 saves an int on a 32-bit platform.
- Programmer 2 retrieves the document on a 64-bit platform and re-saves it, effectively converting it to a 64-bit int.
- Programmer 1 retrieves the document on their 32-bit machine, which decodes the 64-bit int as a double.
编辑:
我刚刚注意到您关于使用 MongoDB shell 导入数据的评论。您可以查看有关 MongoDB shell data types 的 MongoDB 文档查看默认行为:
By default, the mongo shell treats all numbers as floating-point values. The mongo shell provides the NumberInt() constructor to explicitly specify 32-bit integers.
关于数字的 MongoDB 内部数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23359878/
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit