我是NoSQL的新手。我的用例与此相关....许多用户发布消息,我们将其作为不同的文档存储在cloudant中
{
id:random,
userid:xxx,
timestamp: 1449216912282,
msg: "Hi..."
}
我想找出过去5天没有发布任何内容的用户 - 另外我想知道他们是否在过去5到10天之间发布了任何内容。如果有,则发送提醒邮件给用户激活。
哪个选项会更好 - 视图,搜索,cloudant查询?假设我们每小时将有1000个帖子
我创建视图 - map(userid,timestamp)减少为_stats并获得每个用户的最大时间戳。然后迭代这个列表 - 我们得到过去5天没有发布的用户。 其他选项是使用搜索索引,获取所需时间戳之间的所有用户ID。比较应用程序中的两个列表。
有没有办法在单个查询中执行此操作而不会重载应用程序?更改数据格式或创建适当的索引或查看帮助吗?
答案 0 :(得分:0)
如果您的数据如下所示:
{
"_id": "abcdefghijklmon1234",
"userid" : "user1",
"timestamp": 1449739485035,
"msg": "Hi"
}
您可以创建一个MapReduce视图,该视图使用由[ 2015, 50, "user1" ]
组成的键创建索引,其中“2015”是年份,“50”是周数,“user1”是文档的用户ID。这可以通过这样的Map函数实现:
function (doc) {
var getWeek = function(t) {
var date = new Date(t);
date.setHours(0, 0, 0, 0);
date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);
var week1 = new Date(date.getFullYear(), 0, 4);
return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);
};
if (typeof doc.timestamp == "number") {
var d = new Date(doc.timestamp);
var weeknum = getWeek(d.getTime());
var year = d.getFullYear();
emit( [ year, weeknum, doc.userid], null);
}
}
减少“_count”。这允许?startkey=[2015,49]&endkey=[2015,50]&group_level=3
等查询获取上周发布的DID用户列表。没有的用户列表是未出现在上面列表中的用户。
这不是“过去5天”中您的问题的解决方案,而是使用周数。