Couchdb 哪种方法最适合在Cloudant中查询具有相同字段值的最新文档,并再次对该结果进行筛选?

Couchdb 哪种方法最适合在Cloudant中查询具有相同字段值的最新文档,并再次对该结果进行筛选?,couchdb,cloudant,nosql,Couchdb,Cloudant,Nosql,我对NoSQL非常陌生。我的用例与此相关。。。。许多用户发布消息,我们将其作为不同的文档存储在cloudant中 { id:random, userid:xxx, timestamp: 1449216912282, msg: "Hi..." } 我想找出在过去5天内没有发布任何内容的用户-此外,我想知道他们在过去5到10天内是否发布了任何内容。如果有,则向用户发送提醒邮件以激活 视图、搜索、cloudant查询哪个选项更好?假设我们每小时有100

我对NoSQL非常陌生。我的用例与此相关。。。。许多用户发布消息,我们将其作为不同的文档存储在cloudant中

    {
    id:random,
    userid:xxx,
    timestamp: 1449216912282,
    msg: "Hi..."
    }
我想找出在过去5天内没有发布任何内容的用户-此外,我想知道他们在过去5到10天内是否发布了任何内容。如果有,则向用户发送提醒邮件以激活

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

我认为创建视图映射(userid,timestamp)可以减少为_stats并获得每个用户的最大时间戳。然后遍历这个列表-我们得到了在过去5天内没有发布的用户。 另一个选择是使用搜索索引,获取所需时间戳之间的所有用户标识。比较应用程序中的两个列表


有没有办法在不重载应用程序的情况下在单个查询中执行此操作?更改数据格式或创建适当的索引或视图是否有帮助?

如果您的数据如下所示:

{
  "_id": "abcdefghijklmon1234",
  "userid" : "user1",
  "timestamp": 1449739485035,
  "msg": "Hi"
 }
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);
  }
}
您可以创建一个MapReduce视图,该视图创建了一个索引,索引键由
[2015,50,“user1”]
组成,其中“2015”是年份,“50”是周数,“user1”是文档的用户ID。这可以通过以下映射功能实现:

{
  "_id": "abcdefghijklmon1234",
  "userid" : "user1",
  "timestamp": 1449739485035,
  "msg": "Hi"
 }
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);
  }
}
减少“\u计数”。这允许诸如
?startkey=[2015,49]&endkey=[2015,50]&group_level=3等查询获取上周发布的用户列表。未出现在上面列表中的用户列表就是未出现在上面列表中的用户


这不是“过去5天内”问题的解决方案,而是使用周数。

如果您的数据如下所示:

{
  "_id": "abcdefghijklmon1234",
  "userid" : "user1",
  "timestamp": 1449739485035,
  "msg": "Hi"
 }
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);
  }
}
您可以创建一个MapReduce视图,该视图创建了一个索引,索引键由
[2015,50,“user1”]
组成,其中“2015”是年份,“50”是周数,“user1”是文档的用户ID。这可以通过以下映射功能实现:

{
  "_id": "abcdefghijklmon1234",
  "userid" : "user1",
  "timestamp": 1449739485035,
  "msg": "Hi"
 }
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);
  }
}
减少“\u计数”。这允许诸如
?startkey=[2015,49]&endkey=[2015,50]&group_level=3等查询获取上周发布的用户列表。未出现在上面列表中的用户列表就是未出现在上面列表中的用户


这不是“过去5天内”问题的解决方案,而是使用周数。

我想将getWeek函数归功于这篇博文。谢谢Glynn。我在许多其他用例中使用了这种map-reduce方法。但对于这个特殊的问题,我不知道如何通过使用上周发布的用户列表来获取未发布的用户列表-我认为我们仍然必须在应用程序中这样做,而不是直接从cloudant中获取。。。最后,我在之前的视图上使用了cloudant的“列表”功能来删除时间戳大于5天的行……这不是一个好主意,但可以直接从cloudant中删除。我想将getWeek功能归功于这篇博客文章。谢谢Glynn。我在许多其他用例中使用了这种map-reduce方法。但对于这个特殊的问题,我不知道如何通过使用上周发布的用户列表来获取未发布的用户列表-我认为我们仍然必须在应用程序中这样做,而不是直接从cloudant中获取。。。最后,我在前面的视图上使用了cloudant的“列表”功能来删除时间戳大于5天的行……这不是一个好主意,但可以直接从cloudant中删除。