0

I have a collection that is populated with documents that conform to the following schema:

{
  _id,
  name: String,
  actionTime: Date,
  n1: Number,  // 1<=n1<=10
  n2: Number,  // 1<=n2<=10
  n3: Number   // 1<=n3<=20
}

I want to get the frequencies of each possible numbers of n1,n2,n3. So, for example if we have the following documents:

{
  _id: 1,
  name: 'label1',
  actionTime: Date.now,
  n1: 4,
  n2: 9,
  n3: 18
},
{
  _id: 2,
  name: 'label2',
  actionTime: Date.now,
  n1: 1,
  n2: 6,
  n3: 11
},
{
  _id: 3,
  name: 'label3',
  actionTime: Date.now,
  n1: 4,
  n2: 2,
  n3: 5
}

I would like to have a result document of the form (or like this):

{
  "n1": {
    "_id": 1, "total": 1,
    "_id": 2, "total": 0,
    ...
    "_id": 4, "total": 2,
    ...

  },
  "n2": {
    "_id": 1, "total": 0,
    "_id": 2, "total": 1,
    ...
    "_id": 6, "total": 1,
    ...
    _id: 9, 'total': 1,
    ...
  },
  "n3": {
    "_id": 1, "total": 0,
    ...
    "_id": 5, "total": 1,
    ...
    "_id": 11, "total": 1,
    ...
    "_id": 18, "total": 1,
    ...
  }
}

Right now, I have used the aggregation framework with the following command:

db.col.aggregate( [ { $group: { _id: "$n1", total: { $sum: 1 } } }, { $sort: { _id: 1 } } ] )

To get desired result but only for one field (n1). I could iterate this process for all interesting fields, but I would like to know if there is a more compact query to get all at once.

gfot
  • 95
  • 2
  • 11
  • Your desired result is not valid JSON – chridam Sep 22 '16 at 14:48
  • @chridam edited. Also note that the (...) symbol between entries are not part of JSON, just denotes similar items that I would like to skip. Anyway the desired result, as written, is just a prototype to get the picture, not strict valid JSON document. – gfot Sep 22 '16 at 14:57

0 Answers0