Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Mongodb中,如何聚合以计算每组的不同项?_Mongodb_Aggregation Framework - Fatal编程技术网

在Mongodb中,如何聚合以计算每组的不同项?

在Mongodb中,如何聚合以计算每组的不同项?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,在管道中,以下分组 { $group: { "_id": "$salesperson", "items": { $push: "$city" } } } 产生如下结果: { "_id":"Fred", "items": ["Boston", "Chicago", "Chicago", "Boston"] }, { "_id":"Mary", "items": ["Austi

在管道中,以下分组

{
    $group: {
        "_id": "$salesperson", 
        "items": {
            $push: "$city"
        }
    }
}
产生如下结果:

{
    "_id":"Fred",
    "items": ["Boston", "Chicago", "Chicago", "Boston"]
},
{
    "_id":"Mary",
    "items": ["Austin", "Chicago", "Austin", "Louisville"]
}
我想为每个销售人员统计不同的城市,这样我就能得到:

[
    {
        "Fred":2
    }, 
    {
        "Mary":3
    }
]
如何修改管道以实现这一目标?

编辑:按照建议使用
$addToSet
后,我得到如下管道:

[
  {
    "$match": {
      "$and": [
        {
          "field1": {
            "$in": ["a", "b", "c"]
          }
        },
        {
          "field2": {
            "$in": ["d", "e"]
          }
        }
      ]
    }
  }, 
  {
    "$group": {
      "_id": "$salesperson",
      "items": {
        "$addToSet": "$city"
      }
    }
  }
]

如何计算每套、每组中的项目数?

您正朝着正确的方向前进,只是需要使用$addToSet(将字段添加到数组中)而不是$push(将字段添加到数组中)

现在它将产生以下结果:

{
    "_id":"Fred",
    "items": ["Boston", "Chicago"]
},
{
    "_id":"Mary",
    "items": ["Austin", "Chicago", "Louisville"]
}
在下一个阶段中,您可以像现在一样计算数组中的元素

在这里,我添加了完整的查询:

db.collection.aggregate([
    {
        $group: {
            "_id": "$salesperson", 
            "items": {
                $addToSet: "$city"
            }
        }
    },
    {
      $group:{ 
        "_id":null,
        "data":{
            $push:{
                "k":"$_id",
                "v":{
                    $size:"$items"
                }
            }
        }
      }
    },
    {
        $project:{ 
            "data":{
                $arrayToObject:"$data"
            }
        }
    },
    {
        $replaceRoot:{
            "newRoot":"$data"
        }
    }
]).pretty()
它将为您提供输出:

{ "Fred" : 2, "Mary" : 3 }

希望它能帮助你。更多信息请参考。

您希望items数组有重复项并另外获得不同的值计数,还是在items数组中只有唯一的值(城市)可以?如何
$group:{{u id:$salesson,items:{$push:$city}
生成这样的输出
[{“Fred”:[“Boston”,“Chicago”,“Chicago”,“Boston”],{“Mary”:奥斯汀、芝加哥、奥斯汀、路易斯维尔]}]
?请分享完整的信息。@srinivasy uniques才是最重要的。@JoshuaFox我已经更新了答案。看一看,谢谢$addToSet对值进行唯一性验证。但是您的$project子句包含数据值——我如何在管道中使用它?@JoshuaFox请共享您的完整查询和数据,以便我可以重构您的查询并得出解决方案。我添加了查询(管道)。实际的管道在$and中有更多的子句,但这正确地表示了$match和$group结构。谢谢!两个注释:(1)您的第一个代码块有$push,但我认为需要$addToSet;(2)为了清楚起见,您能否将第一个代码块合并到第三个(aggregate()调用)中,其中$group应该在第二个group之前的数组中。@JoshuaFox哈哈,似乎$addToSet在上次编辑中被替换了。我已经用完整的查询更新了答案。
{ "Fred" : 2, "Mary" : 3 }