我有一个传感器值的mongoDB集合,我正在尝试查找集合中特定日期范围内的所有文档。我已阅读文档并实际实现了代码以查找所有数据。但是,我正在将所有文档写入CSV文件,以便我可以从Web下载它们。我遇到的问题是查询似乎正在查找正确日期范围内的所有数据(我在服务器端和客户端都打印了日期,两者都匹配正确的日期范围)但是,CSV文件只返回大约一半的数据(它永远不会一致)。 例如,假设我正在查询我的集合以返回存储在之间的所有文档:
(2013年5月9日星期五07:57:06 GMT-0400)和(2013年5月14日星期二00:40:43 GMT-0400)
当我单击下载数据按钮时,它会向服务器发送请求以查找此范围内的所有文档,然后将文档流式传输到文本文件并将其提供给客户端。我在服务器和客户端上打印到控制台的日期,一切都匹配...所以我很确定mongodb find函数在查询中使用了正确的日期。
但是,当我打开此查询的CSV文件时,它会显示从(2013年5月9日07:57:15 - >第一个日期条目gte到开始日期)的文档列表。但仅返回值(星期六2013年5月11日01:04:09)。这是查询中似乎缺少的大约三天的数据。由于我的传感器每8秒将数据上传到集合,因此这是数千个条目。是否对使用find函数检索的文档数量有某种数据限制? CSV文件有近6,850个条目(在星期四到星期六之间)...但是为什么它不会返回星期四到星期二之间的完整值列表?我检查了数据库并知道它在这个时间范围内一直存储数据......所以我认为这不是问题所在。有没有人有任何想法?
以下是我的查找功能的代码:
collection.find({"addr": Number(json.addr),
"Time": {$gte:new Date(json.startDate),
$lte:new Date(json.endDate)}},
proj,
function (err, docs)
{
if( err || !docs) console.log("No data found");
else
{
var tempname=json.type+".csv";
var stream=fs.createWriteStream("pages/"+tempname);
stream.on('error', function(e){console.error(e);});
docs.each(function(err2, doc)
{
if (!doc)
{
console.log("done");
stream.end();
res.writeHead(200, {"Content-Type": "application/json"});
res.write(JSON.stringify({fname:tempname}));
res.end();
return;
}
stream.write(doc.Time+","+doc[json.type]+"\n");
});
}
});
答案 0 :(得分:0)
stream.write()
在缓冲区已满时返回false,因此您需要检查它。
另请参阅[Writing large files with Node.js]了解详情。