计算MongoDB中的唯一值

时间:2018-06-26 16:17:35

标签: mongodb sum aggregation-framework

在我的mongoDB管道的$facet阶段中,由于某些记录引用了相同的“ customer.id”,因此我需要根据“ customer.id”的唯一出现次数进行计数。我已经尝试过了:

"totalCustomers" : [ { $group : { "$customer.id" : { $sum: 1 } } } ]

...,但最终出现错误:“字段名称'$ customer'不能是运算符名称”。

我也尝试过:

"totalCustomers" : [  { "$group" : { "_id" : "$customer.id", "count" : { "$sum" : 1 }}}   ]

...不会出错,但是可以给我所有记录,而不是所有这些记录的数字计数。

对我的数据集中的每个唯一“ $ customer.id”进行计数的语法是什么?我的理解是,我需要在$sum$group阶段中使用$project,但是尚不清楚它的外观。

为进一步澄清,如果我的数据结构如下:

[
  {
  id: '111',
  someProp: <value>,
  customer: { id: '222' } 
  },
  {
  id: '112',
  someProp: <value>,
  customer: { id: '222' } 
  }
]

...我应该以“ totalCustomers:1”结尾。

1 个答案:

答案 0 :(得分:3)

您可以在两个步骤中完成该操作:

public function write(&$htmlTmpl)
{

    $html_advanced_options = '<a href="#">My link</a>';
    $html_advanced_options .= 'other html';
    ...        

    $tmpl_advanced_options = $htmlTmpl->createDocumentFragment();
    $tmpl_advanced_options->appendXML( $html_advanced_options );

    $nodeLine = $htmlTmpl->getElementsByTagName("hr")->item(0);
    $parentNode = $htmlTmpl->getElementsByTagName("div")->item(0);
    $parentNode->insertBefore( $section_advanced_options, $nodeLine );
    $parentNode->insertBefore( $tmpl_advanced_options, $section_advanced_options );

}

这将创建一个包含所有[ {$group: {_id: null, customerIds: {$addToSet: '$customer.id'}}}, {$project: {uniqueCustomers: {$size: '$customerIds'}}} ] 的集合(从技术上讲是一个没有重复的数组)并获取其大小。