I am retrieving data from my mongoDB database and I want to be able to sort documents by subtraction on length of inner arrays. My data structure looks like:
[
  {
   _id: "6bcdf5b7-0757-4195-a0b6-d7ec3d59d194",
   status: {
      plus: ['1', '2'],
      minus: ['1']
  },
  {
   _id: "6fb2ea76-8f12-4200-98fa-72201ba5f8c1",
   status: {
      plus: ['1', '2', '3', '4'],
      minus: []
  },
  {
   _id:"b1ecf353-acea-4808-a847-27b765c52230"
   status: {
      plus: ['1', '2', '3'],
      minus: ['1', '2', '3']
  },
...
]
What I am looking for - array of docs which is sorted by subtract of lengths plus and minus arrays.
Result, that I am looking for:
[
   {
   _id: "6fb2ea76-8f12-4200-98fa-72201ba5f8c1",
   status: {
      plus: ['1', '2', '3', '4'],
      minus: [] // subtract - 4
  },
  {
   _id: "6bcdf5b7-0757-4195-a0b6-d7ec3d59d194",
   status: {
      plus: ['1', '2'],
      minus: ['1'] // subtrack - 1
  },
  {
   _id:"b1ecf353-acea-4808-a847-27b765c52230"
   status: {
      plus: ['1', '2', '3'],
      minus: ['1', '2', '3'] // subtrack - 0
  },
...
]
I found Aggregation framework, but I cant find a way to use it in my way.
Of course, documents have much more properties in them, so group is not a best way, by my opinion.
So my final result looks like this:
   col.aggregate([
        {
          $project: {
            status_count: {
              $subtract: [
                { $size: { $ifNull: ['$status.plus', []] } },
                { $size: { $ifNull: ['$status.minus', []] } }
              ]
            }
          }
        },
        {
          $sort: { status_count: -1 }
        }
      ])
Problems is: it looses all of other properties, including status object, I cant user additional find query, I cant skip and limit for the pagination.
