我试图在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时会出现这种错误?我想我已经解决了,但我欢迎任何其他信息或输入。
答案 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'中,添加并享受旅程