哪种方法最适合查询Cloudant以获取具有相同字段值的最新文档,并再次对该结果进行过滤?

时间:2015-12-10 09:07:31

标签: couchdb cloudant nosql

我是NoSQL的新手。我的用例与此相关....许多用户发布消息,我们将其作为不同的文档存储在cloudant中

    {
    id:random,
    userid:xxx,
    timestamp: 1449216912282,
    msg: "Hi..."
    }

我想找出过去5天没有发布任何内容的用户 - 另外我想知道他们是否在过去5到10天之间发布了任何内容。如果有,则发送提醒邮件给用户激活。

哪个选项会更好 - 视图,搜索,cloudant查询?假设我们每小时将有1000个帖子

我创建视图 - map(userid,timestamp)减少为_stats并获得每个用户的最大时间戳。然后迭代这个列表 - 我们得到过去5天没有发布的用户。 其他选项是使用搜索索引,获取所需时间戳之间的所有用户ID。比较应用程序中的两个列表。

有没有办法在单个查询中执行此操作而不会重载应用程序?更改数据格式或创建适当的索引或查看帮助吗?

1 个答案:

答案 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天”中您的问题的解决方案,而是使用周数。