我在这里面临一个问题。实际上我有一个非常大的数据集存储在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');
}
});
}
任何人都可以帮助我获得结果吗?
答案 0 :(得分:1)
耶!!首先要记住,您需要在创建的字段上添加索引,以便您可以轻松获取数据,因为您已经提到yuo在您的数据库中有数百万行。 第二,你可以使用date.getTime()轻松获得以毫秒为单位的时间。因此,您可以获得用户到达的时间以及之前的时间(以毫秒为单位)并减去它们。