【发布时间】:2014-06-11 19:35:05
【问题描述】:
我正在创建我的批处理并使用我在下面指定的命令将其插入到集合中
batch = []
time = 1.day.ago
(1..2000).each{ |i| a = {:name => 'invbatch2k'+i.to_s, :user_id => BSON::ObjectId.from_string('533956cd4d616323cf000000'), :out_id => 'out', :created_at => time, :updated_at => time, :random => '0.5' }; batch.push a; }
Invitation.collection.insert batch
如上所述,每条邀请记录都将user_id 字段值设置为'533956cd4d616323cf000000'
使用created_at: 1.day.ago 插入我的批次后,我得到:
2.1.1 :102 > Invitation.lte(created_at: 1.week.ago).count
=> 48
2.1.1 :103 > Invitation.lte(created_at: Date.today).count
=> 2048
还有:
2.1.1 :104 > Invitation.lte(created_at: 1.week.ago).where(user_id: '533956cd4d616323cf000000').count
=> 14
2.1.1 :105 > Invitation.where(user_id: '533956cd4d616323cf000000').count
=> 2014
另外,我有一个 map reduce,它计算每个唯一用户发送的邀请(总数和发送到唯一 out_id)
class Invitation
[...]
def self.get_user_invites_count
map = %q{
function() {
var user_id = this.user_id;
emit(user_id, {user_id : this.user_id, out_id: this.out_id, count: 1, countUnique: 1})
}
}
reduce = %q{
function(key, values) {
var result = {
user_id: key,
count: 0,
countUnique : 0
};
var values_arr = [];
values.forEach(function(value) {
values_arr.push(value.out_id);
result.count += 1
});
var unique = values_arr.filter(function(item, i, ar){ return ar.indexOf(item) === i; });
result.countUnique = unique.length;
return result;
}
}
map_reduce(map,reduce).out(inline: true).to_a.map{|d| d['value']} rescue []
end
end
问题是:
Invitation.lte(created_at: Date.today.end_of_day).get_user_invites_count
返回
[{"user_id"=>BSON::ObjectId('533956cd4d616323cf000000'), "count"=>49.0, "countUnique"=>2.0} ...]
而不是"count" => 2014, "countUnique" => 6.0 而:
Invitation.lte(created_at: 1.week.ago).get_user_invites_count 返回:
[{"user_id"=>BSON::ObjectId('533956cd4d616323cf000000'), "count"=>14.0, "countUnique"=>6.0} ...]
查询提供的数据,在插入批次之前是准确的。
我无法理解这里发生了什么。我错过了什么吗?
【问题讨论】:
标签: javascript ruby mongodb mapreduce mongoid