首页 > 解决方案 > MongoDB $push 运算符并计算名称中的字符

问题描述

我已经在名为 people 的集合中使用以下数据填充了 Mongodb 中的数据库。

{ "_id" : 0, "name" : "Bernice Pope", "age" : 69, "date" : "2017-10-04T18:35:44.011Z" }

{ "_id" : 1, "name" : "Eric Malone", "age" : 57, "date" : "2017-10-04T18:35:44.014Z" }

{ "_id" : 2, "name" : "Blanche Miller", "age" : 35, "date" : "2017-10-4T18:35:44.015Z" }

{ "_id" : 3, "name" : "Sue Perez", "age" : 64, "date" : "2017-10-04T18:35:44.016Z" }

{ "_id" : 4, "name" : "Ryan White", "age" : 39, "date" : "2017-10-04T18:35:44.019Z"}

{ "_id" : 5, "name" : "Grace Payne", "age" : 56, "date" : "2017-10-04T18:35:44.020Z" }

{ "_id" : 6, "name" : "Jessie Yates", "age" : 53, "date" : "2017-10-04T18:35:44.020Z"}

{ "_id" : 7, "name" : "Herbert Mason", "age" : 37, "date" : "2017-10-4T18:35:44.020Z" }

{ "_id" : 8, "name" : "Jesse Jordan", "age" : 47, "date" : "2017-10-04T18:35:44.020Z"}

{ "_id" : 9, "name" : "Hulda Fuller", "age" : 25, "date" : "2017-10-04T18:35:44.020Z"}

基于人员集合,我需要创建一个名为 PeopleNames 的视图,如下所示:

{ "LengthOfName": 8, "names" : [ "Sue Perez" ]}

{ "LengthOfName" : 9, "names" : [ "Ryan White" ]}

{ "LengthOfName" : 10, "names" : [ "Eric Malone", "Grace Payne" ]}

{ "LengthOfName" : 11, "names" : [ "Bernice Pope", "Jessie Yates", "Jesse Jordan", "Hulda Fuller" ]}

{ "LengthOfName" : 12, "names" : [ "Herbert Mason" ]}

{ "LengthOfName" : 13, "names" : [ "Blanche Miller"]}

LengthOfName 是姓氏和名字中的字符总数。我的方法是首先将名称添加到数组中,使用$split运算符拆分名称并使用$strLenCP计数字符。

db.people.aggregate([
    {
    $project : {
        name : 1,
        name_array : [{$push : { $split : {$name : " "}}}] 
    }
}

,{
    
    $unwind : "$name_array"
},{
    $project : {
        name : 1,
        nameLength : {$strLenCP : $name_array}
    }
},{
    $group :{
        _id : "$nameLength",
        nameLength: 1
        
    }
}])

但是我收到错误消息,说我的"$name_array" is undefined任何想法?

标签: mongodbmongodb-query

解决方案


$push聚合运算符仅在$group阶段中可用。

您可以按名称长度对文档进行分组(在使用 修剪名称中的空格之后$replaceAll)并使用$push将名称添加到names数组中。然后,您可以添加一个$project阶段以将LengthOfName字段添加到文档中,最后添加一个$sort阶段以按字段对文档进行排序LengthOfName

db.collection.aggregate([
  {
    $group: {
      _id: {
        $strLenCP: {
          $replaceAll: {
            input: "$name",
            find: " ",
            replacement: ""
          }
        }
      },
      names: {
        $push: "$name"
      }
    }
  },
  {
    $project: {
      _id: 0,
      LengthOfName: "$_id",
      names: "$names",
    }
  },
  {
    $sort: {
      LengthOfName: 1,
    }
  }
])

Mongo游乐场


推荐阅读