MongoDB:如果字段的值与条件匹配,如何计算字段?

时间:2014-11-22 17:38:45

标签: mongodb

我有一个包含如下字段的文档:

{
 ...
 log: [
    {
      utc_timestamp: ISODate("2014-11-15T10:26:47.337Z"),
      type: "clicked"
    },
    {
      utc_timestamp: ISODate("2014-10-15T16:12:51.959Z"),
      type: "emailed"
    },
    {
      utc_timestamp: ISODate("2014-10-15T16:10:51.959Z"),
      type: "clicked"
    },
    {
      utc_timestamp: ISODate("2014-09-15T04:59:19.431Z"),
      type: "emailed"
    },
    {
      utc_timestamp: ISODate("2014-09-15T04:58:19.431Z"),
      type: "clicked"
    },
  ],
  ...
}

如果本月没有“通过电子邮件发送”类型的日志条目,我如何从本月获得“点击”类型的日志条目数?

换句话说,我想找出哪些点击未发送相关电子邮件。

因此,在此示例中,计数将为1,因为最近的“点击”条目没有“通过电子邮件发送”条目。

注意:对于此用例,点击没有唯一ID - 这是记录的所有数据。

2 个答案:

答案 0 :(得分:1)

使用以下聚合管道:

db.click_log.aggregate([
    { "$match" : { "log.type" : { "$ne" : "emailed" } } }, // get rid of docs with an "emailed" value in log.type and docs not from this month
    { "$unwind" : "$log" }, // unwind to get log elements as separate docs
    { "$project" : { "_id" : 1, "log" : 1, "month" : { "$month" : "$log.utc_timestamp" } } },
    { "$match" : { "log" : "clicked", "month" : <# of month> } }, // get rid of log elements not from this month and that aren't type clicked
    { "$group" : { "_id" : "$_id", "count" : { "$sum" : 1 } } } // collect clicked elements from same original doc and count number
])

对于没有通过电子邮件发送的每个文件,这将返回&#34;作为log.type的值,数组log的元素数量log.typeclicked以及当前月份的时间戳。如果您希望每月滑动30天,请将$match更改为包含所需时间段$gt$lt的范围查询。

答案 1 :(得分:0)

您可以使用与下面类似的查询。

db.dbversitydotcom_col.aggregate([ { $unwind: “$log” }, 
  { $match: { “log.type” : “clicked”, "log.utc_timestamp" : "your required date" } }, 
   { $sort: { “Files.Size” : -1.0 } }, { $limit: 5.0 } ]).count()

有关详细说明,请参阅http://dbversity.com/mongodb-importance-of-aggregation-framework/