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,预期:整数”

MongoDB 在对象数组中找到 $near

TypeError:“Int64Index”对象不可调用

Mongodb找到比较数组元素到数组字段

将 64 位 int 值写入 NSOutputStream