在mongo数据库中,我有大约400万个文档(每个文档包含一个时间戳和一个值)。
我有一个用例,我需要能够通过rest api查询所有文档。我在控制器中使用sails-mongo或直接使用node-mongodb-native在sailsjs中进行了几次测试,但是这两个解决方案均未起作用,该过程挂起并且永不返回。
如果我直接使用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,但是查询整个集合的次数不足。

第三种情况:从Sails控制器通过Sails-mongo ORM

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


似乎一旦从mongo中获取了结果,整个结果(4.000.000次...)上的几个循环(映射rewriteIDs并调用toJSON方法)就浪费了很多时间,并导致进程永久挂起。 。

关于如何使node / mongo用于查询如此大量数据的任何想法?

最佳答案

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

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

您可以使用async来实现。

09-05 00:59
查看更多