使用Mongoose和MongoDB处理大型数据集

时间:2014-05-07 13:21:05

标签: mongodb mongoose

我在这里面临一个问题。实际上我有一个非常大的数据集存储在mongo db中。我必须对此数据集执行一些分析。

我在数据库中拥有的数据如下:

     { type: 'go_to_page',
        params: { page: 'shouts' },
        _id: 52f7add2efaf195c0300ab0f,
        created: Sun Feb 09 2014 22:03:22 GMT+0530 (IST)
        user: ObjectId('34eesdfe3456efr345eee3');
     }

我的数据库中有大约一百万行用于上述数据集。现在我必须使用mongoose处理数据集。我必须提取的信息如下所述。

" PARAMS"上述架构中的字段可以采用四个值' profile',' people'' shout'和'事件'。现在,如果用户从个人资料页面转到人员页面,则用户在个人资料页面上花费的时间将为:

  

用户到达个人资料页面的时间 - 用户到达人员页面的时间。

因此可以看出,使用mongoose逐个提取行有助于获取所需信息,因为信息提取至少需要两行。

现在问题是我的数据库中有大约一百万行,数据库中有大约600个不同的用户。对于每个用户,我必须知道他每天花费多少时间(#34;每天(按日期排列)"。我写的当前代码大约需要20分钟才能获取只有用户名及其日志,这是不可接受的。

我的确切当前代码如下所示:

    var sessionSchema = require('./model/sessions');
    var ContactSchema3 = require('./model/sessions');
    var ContactModel3 = mongoose.model('Contact3', ContactSchema3, 'logs');
    var SessionModel = mongoose.model('Session', sessionSchema, 'sessions');
     exports.session = function(req, res) {

     var query1 = SessionModel.find({}, {
     created: true
     }).sort({
       created: -1
     }).limit(1);

     /* query for executing the latest date */
      query1.exec(function(err, val) {
       if (!err) {
         console.log('there is error',err);
       }

       else {
         /* fetch the list of all users */
            var userObjId = ContactModel3.distinct('user');
             userObjId.exec(function(err, rslt1) {

               /* iterate over all users to fetch their logs in bunch of 1000 */
               rslt1.forEach(function(value, id) {
                 var fun = function(currentIndex) {
                  var que = ContactModel3.find({
                  user: value
                  }, {
                   type: 1,
                   params: 1,
                   created: 1
                  }).sort({
                  created: -1
                  }).skip(currentIndex).limit(500).exec(function(err, rslt) {
                   if (!err) {
                     if (rslt.length === 0 || rslt === undefined || rslt === [] || rslt === {} || rslt === null) {
                console.log('rslt while returning is ', rslt);
                   return;
                    } else {


                /* place for manipulation function */
          /* place for manipulation function ends here  */
                currentIndex += 500;
                fun(currentIndex);
              }
            } else {
              console.log('there is error', err);
              }
             });
            }
           fun(0);
          });
         });
        }
       } else {
       console.log('there is error');
      }
     });
    }

任何人都可以帮助我获得结果吗?

1 个答案:

答案 0 :(得分:1)

耶!!首先要记住,您需要在创建的字段上添加索引,以便您可以轻松获取数据,因为您已经提到yuo在您的数据库中有数百万行。 第二,你可以使用date.getTime()轻松获得以毫秒为单位的时间。因此,您可以获得用户到达的时间以及之前的时间(以毫秒为单位)并减去它们。