2

我试图在 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

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

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

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

4

2 回答 2

2

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

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

在 github 问题中还提到了一个解决方案,即增加sockettimeoutmsURI 中的 。在连接 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}')
于 2018-04-19T15:16:09.877 回答
2

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

于 2018-11-27T19:15:05.717 回答