如何计算数组对象的大小并在MongoDB中展开它

时间:2018-10-25 03:17:59

标签: mongodb aggregation-framework

我需要计算数组对象的大小,还需要获取数组中每个标记为raised_amount的字段的平均值。但是,MongoDB展开后不会让我计算数组的大小(duh)。在展开之前,Mongo不会让我计算数组大小。这是我要参加的课程。挑战很大。

db.research.aggregate({$unwind:"$funding_rounds"},
    {"$group": {
       "_id":{"name": "$name"},
       "averageFunding" : {
           "$avg" : "$funding_rounds.raised_amount"
        }
      }
    },
    {$project: { count: { $size:"$funding_rounds" }}},
    { $sort: { averageFunding: -1 } },
    {"$limit":10})

取出{$project: { count: { $size:"$funding_rounds" }}}即可使用!但是,我没有funding_round计数。尝试自己计算回合数,这是可行的。

数据示例:

{
  "name": "Facebook",
  "total_money_raised": "$39.8M",
  "funding_round": [
    {
      "example": 123,
      "round_code": "a",
      "raised_amount": "1232"
    },
    {
      "example": 123,
      "round_code": "bat",
      "raised_amount": "1232"
    },
    {
      "example": 123,
      "round_code": "cat",
      "raised_amount": "1232"
    }
  ]
}

关于在此聚合中如何计算数组大小的任何想法?

1 个答案:

答案 0 :(得分:1)

$size需要一个数组,并且您$unwind个数组要在计数之前成为对象。这就是MongoDB限制计数大小的原因。

尝试以下代码:

<table>
  <tr>
    <th>Name</th>
    <th>Age</th> 
  </tr>
  <tr>
    <td contenteditable="true" (blur)="update(data, 'name', $event)">{{data?.name}}</td>
    <td contenteditable="true" (blur)="update(data, 'age', $event)">{{data?.age}}</td> 
  </tr>
</table>

Data: name[{{data?.name}}], age[{{data?.age}}]

输出:

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  public data = { name: null, age: null};

  public update(data, prop, ev) {
    data[prop] = ev.target.textContent;    // <-- !!!
  }
}

如果NAME字段是唯一的:

我还要在这里提及的另一件事是,如果您的db.getCollection('tests').aggregate([ { $project: { _id: 1, name: 1, total_money_raised : 1, funding_round :1, size: { $size:"$funding_round" } } }, { $unwind : "$funding_round"}, { $group:{ _id: "$name", avgFunding : {"$avg" : "$funding_round.raised_amount"}, size: {$first : "$size"}, totalCount : {$sum: 1} } }, { $sort: { "avgFunding": -1 } }, { "$limit":10 } ]) 字段是唯一的,而您只想拥有一个数组的大小,则可以/* 1 */ { "_id" : "Facebook", "avgFunding" : 1232.0, "size" : 3, "totalCount" : 3.0 } 然后计算name时的文档总数,如下所示:

unwind

输出:

$group

大小为从数组中解开的文档总数。