Mongodb 找到错误的结果 Int64 对象
Posted
技术标签:
【中文标题】Mongodb 找到错误的结果 Int64 对象【英文标题】:Mongodb find with wrong result Int64 object 【发布时间】:2016-07-07 10:55:03 【问题描述】:我正在使用 MongoDB 3.2.1 / python 3.4 / pymongo / pandas 0.17(尽管后两者可能与这个问题完全无关)。
我在使用 MongoDB find 时遇到了一个非常奇怪(和错误)的行为。
我有一个集合,包含这样的文档:
"_id" : NumberLong(-1819413477243867792),
"targetentity" : "NODOGENERICO .ag.HP_BAR_DEG_APP_1",
"tx" : false,
"ocname" : ".oc.serv6",
"specificproblem" : null,
"saf" : false,
"iscriticalnode" : null,
"checkmask" : null,
"notificationidentifier" : 1347592,
"province" : null,
"usertext" : null,
"additionaltext" : "AAA Invalid Response",
"director" : ".temip.madrids01_director",
"problemoccurences" : 1,
"usertags" : null,
"managedobject" : "NODOGENERICO .ag.HP_BAR_DEG_APP_1",
"isacceptednode" : null,
"elementcode" : null,
"state" : "Terminated",
"probablecause" : "Unknown",
"ran" : false,
"counttotal" : 1,
"locationcode" : "NULL",
"problemstatus" : "Closed",
"structurednotes" : null,
"collection" : "serv6",
"operatornotes" : null,
"alarmtype" : "CommunicationsAlarm",
"workinfo" : null,
"perceivedseverity" : "Major",
"core" : true,
"eventtime" : NumberLong(1467342666000),
"originalseverity" : "Major",
"vendor" : "Several",
"controlelementcode" : null,
"outageflag" : false,
"incident" : null,
这个“_id”它基本上是一个使用 Python 3.4 的“hash”内置方法计算的哈希。
问题是我插入后找不到任何具有此id的元素。
我已经尝试过了(此时我直接在 mongo 终端上尝试了这个,但是在 Pymongo 上它得到了相同的结果):
db.getCollection('unique_alarm').find("_id": NumberLong(-1819413477243867792)
和
db.getCollection('unique_alarm').find("_id": -1819413477243867792)
对于这两个我都明白了:
在 1 毫秒内获取 0 条记录
我认为问题在于我如何处理 NumberLong,但对于字段 eventtime(具有相同类型)我绝对没有问题。
即,如果我查询事件时间:
db.getCollection('unique_alarm').find("eventtime" : NumberLong(1467342666000))
或通过:
db.getCollection('unique_alarm').find("eventtime" :1467342666000)
这两个查询都再次返回第一个文档,没问题。
关于发生了什么的任何线索?为什么前两个查询返回 0 个结果?
更多关于我的试验和错误的信息:
不管该字段是“_id”还是任何其他字段,我都无法搜索这些数字 我正在使用 pymongo 插入这些文档 如果我尝试再次插入此文档(使用 pymongo 或 mongodb 终端),我会收到重复键错误...【问题讨论】:
如果有人感兴趣,我的解决方法是将类型转换为 string。所以基本上,在插入之前,我将数字转换为字符串,然后按字符串值进行搜索,并且效果很好。我的猜测是某些类型的 NumberLong 和 Mongodb 搜索存在一些问题(可能与 python 哈希的结果有关) 【参考方案1】:答案可能是微不足道的,但所有都与数字 long 值周围的引号 "
相关。
插入数据和查询需要'引用'
db.sofia.find("_id" : NumberLong("-1819413477243867792")).pretty()
"_id" : NumberLong("-1819413477243867792"),
"targetentity" : "NODOGENERICO .ag.HP_BAR_DEG_APP_1",
"tx" : false,
"ocname" : ".oc.serv6",
....
【讨论】:
成功了,谢谢!您知道为什么即使没有引号,其他字段 'eventtime' 也能正常返回吗?它不应该也返回 0 个结果吗?我想这就是为什么我从未尝试过使用引号。 可能是由于 shell 中的 javascript 限制,但我不是 100% 确定【参考方案2】:我认为您在 mongo NumberLong 中遇到了某种限制。
我打开了一个 mongo 控制台,这是输出
> NumberLong(-1819413477243867792)
NumberLong("-1819413477243867904")
所以我假设如果你通过 NumberLong("-1819413477243867904") 找到你的记录,你会神奇地找到你的记录,如果 NumberLong,这可能证明你的哈希值达到了某种 mongo db 限制。
【讨论】:
以上是关于Mongodb 找到错误的结果 Int64 对象的主要内容,如果未能解决你的问题,请参考以下文章
对象类型为'int64'的叶子热图不是JSON可序列化的错误
使用 Hibernate 将 Java 应用程序从 DB2 迁移到 BigQuery 时出现错误“找到:int64,预期:整数”