【问题标题】:Cannot query the whole collection through sails (sails-mongo or mongodb-native)无法通过sails查询整个集合(sails-mongo或mongodb-native)
【发布时间】:2014-12-20 10:48:08
【问题描述】:

在 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 用于查询大量数据的任何想法?

【问题讨论】:

    标签: node.js mongodb scalability sails.js


    【解决方案1】:

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

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

    您可以使用async 来实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多