【发布时间】: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 哈希的结果有关)