无法通过风帆查询整个集合(sails-mongo或mongodb-native)

时间:2014-10-24 14:58:41

标签: node.js mongodb scalability sails.js

在mongo数据库中,我有类似400万个文档(每个文档由时间戳和值组成)。
我有一个用例,我需要能够通过rest api查询所有文档。我使用sails-mongo或者在控制器中直接使用node-mongodb-native进行sailsjs的sevreral测试,但这2个解决方案都没有工作,这个过程挂起,永远不会回来。
如果我直接使用mongo shell,我可以查询整个集合(当然它有点长,但这是很多数据)。

第一种情况:来自mongo shell

var v= db.data.find()
v.length() => returns 4280183 in something like 30 sec

在mongodb.log中我可以看到所有' getmore'包含退回商品数量的行

第二种情况:来自我的sails控制器(使用node-mongodb-native)

// TEST WITH MONGODB NATIVE
native_find: function(req, res){
    var MongoClient = require('mongodb').MongoClient;
    var url = 'mongodb://localhost:27017/jupiter';
    MongoClient.connect(url, function(err, db) {
        console.log("Connected correctly to server");

        var collection = db.collection('data');

        // Find all data
        collection.find({}).toArray(function(err, d) {
          db.close();
          res.json(d);
        });
      });
    }

该过程被触发,mongo似乎有效,但过了一段时间我有以下错误:

$ curl 'http://192.168.1.143:8000/native_find'
curl: (52) Empty reply from server

如果我签入mongo日志,我可以看到一些getmore但是还不足以查询整个集合。

第3种情况:从风帆控制器到sails-mongo ORM

// TEST WITH SAILS-MONGO
sailsmongo_find: function(req, res){
    Data.find().exec(function(err, d){
       return res.json(d);
    });
}

似乎一旦结果从mongo中检索出来,几个循环(在rewriteIDs中映射并调用toJSON方法)整个结果(4.000.000次......)正在耗费时间并导致进程挂起永远...

有关如何让node / mongo在大量数据上进行查询的想法吗?

1 个答案:

答案 0 :(得分:0)

这是在单个操作中检索的大量数据,尝试在批处理过程中以异步方式获取数据。

也许您可以限制为100.000 o 200.000结果并将其保存到数组中,然后您可以要求更多结果。

您可以使用async来实现这一目标。