【问题标题】:Count number of times string matches a field across multiple documents计数字符串与多个文档中的字段匹配的次数
【发布时间】:2013-10-04 04:30:31
【问题描述】:

假设我有一些看起来像这样的文档:

{
  'domain': 'www.stackoverflow.com',
  'time': 1380860676457
}
{
  'domain': 'www.google.com',
  'time': 1380860678001
}
{
  'domain': 'www.stackoverflow.com',
  'time': 1380860657233
}

得到以下输出的最佳方法是什么?

{
  'domain': 'www.stackoverflow.com',
  'count': 2
}

如果初始集合包含一百万或更多文档,是否有任何性能考虑(存储日志的不同方式?)?

【问题讨论】:

  • 您可以为此使用聚合函数,并且可以在域字段上建立索引。

标签: mongodb mongodb-query database


【解决方案1】:

您可以使用聚合。比如:

db.sites.aggregate([{
  $group: {
    _id: '$domain',
    count: {$sum: 1}
  }
}]);

这对域字段进行分组,并为找到的每个文档加 1。为了使它看起来像您想要的输出,您还可以向聚合添加投影操作:

$project: {
  domain: '$_id',
  count: 1,
  _id: 0
}

【讨论】:

    【解决方案2】:

    您需要的只是按domain 分组并求和块。您可以通过收集方法aggregate 来做到这一点,如下所示:

    db.cls.aggregate(
     {$group:{_id:"$domain", count: {$sum : 1}}},
     {$project:{_id:0, domain:"$_id", count:"$count"}}
    )
    

    首先,$group 给你:

    {
        "result" : [
                {
                        "_id" : "www.google.com",
                        "count" : 1
                },
                {
                        "_id" : "www.stackoverflow.com",
                        "count" : 2
                }
        ],
        "ok" : 1
    }
    

    第二个,$project 给你:

    {
        "result" : [
                {
                        "count" : 1,
                        "domain" : "www.google.com"
                },
                {
                        "count" : 2,
                        "domain" : "www.stackoverflow.com"
                }
        ],
        "ok" : 1
    }
    

    或者你可以通过收集方法group来做到这一点:

    db.cls.group({
      key: {domain:1},
      reduce: function(curr,result){ result.count += 1 },
      initial:{count:0}
    })
    

    如@AnujAneja 所述,为了加快进程,您应该在domain 字段上建立索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 2020-04-04
      相关资源
      最近更新 更多