Mongolite错误:无法读取4个字节:套接字错误或超时

时间:2018-04-19 15:16:10

标签: r mongolite

我试图在mongo数据库中查询数据库中包含的所有id,这样我就可以将列表与单独的数据帧进行比较。但是,当我尝试查找我所提供的所有sample_id字段时:

  

错误:无法读取4个字节:套接字错误或超时

查询查询的示例:

library(mongolite)
mongo <- mongo(collection,url = paste0("mongodb://", user,":",pass, "@", mongo_host, ":", port,"/",db))
mongo$find(fields = '{"sample_id":1,"_id":0}')
# Error: Failed to read 4 bytes: socket error or timeout

如错误所示,这可能是由于大量数据导致的某些内部套接字超时问题。但是,在the mongo documentation中,默认设置为永不超时。

  

socketTimeoutMS:   在尝试超时之前尝试在套接字上发送或接收的时间(以毫秒为单位)。默认情况永远不会超时,但不同的驱动程序可能会有所不同请参阅驱动程序文档。

所以我的问题是为什么在使用mongolite时会出现这种错误?我想我已经解决了,但我欢迎任何其他信息或输入。

2 个答案:

答案 0 :(得分:1)

简单的答案是,如上面mongo文件的引用所示,“不同的司机可能会有所不同”。在这种情况下,mongolite的默认值是5分钟,在this github问题中找到,我猜它与C驱动程序有关。

  

连接的默认套接字超时为5分钟。这意味着   如果您的MongoDB服务器死亡或变得不可用,则需要5个   分钟来检测这个。你可以通过提供来改变这一点   sockettimeoutms =在您的连接URI中。

在github问题中还提到了一个解决方案,即增加URI中的sockettimeoutms。在连接URI的末尾,您应该添加?sockettimeoutms=1200000作为选项,以在套接字超时之前增加时间长度(在这种情况下为20分钟)。修改原始示例代码:

library(mongolite)
mongo <- mongo(collection,url = paste0("mongodb://", user,":",pass, "@", mongo_host, ":", port,"/",db,"?sockettimeoutms=1200000"))
mongo$find(fields = '{"sample_id":1,"_id":0}')

答案 1 :(得分:1)

Laravel:在您的database.php'sockettimeoutms'=>'1200000'中,添加并享受旅程