MongoDB查找查询不返回所有值

时间:2013-05-20 18:23:31

标签: node.js mongodb

我有一个传感器值的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");
                     });
                   }
                });

1 个答案:

答案 0 :(得分:0)

stream.write()在缓冲区已满时返回false,因此您需要检查它。

另请参阅[Writing large files with Node.js]了解详情。