как посчитать отличное значение в космосе БД - PullRequest
0 голосов
/ 01 июня 2018

Я создал несколько документов в базе данных Cosmos, например:

[
  {
    "class": "class01",
    "student": {
      "lastReport": [
        {
          "Name": "st01",
          "score": "C"
        },
        {
          "Name": "st02",
          "score": "B"
        }
      ],
      "lastTime": "2018-05-10"
    }
  },
  {
    "class": "class02",
    "student": {
      "lastReport": [
        {
          "Name": "st03",
          "score": "C"
        },
        {
          "Name": "st01",
          "score": "A"
        }
      ],
      "lastTime": "2018-05-10"
    }
  },
  {
    "class": "class01",
    "student": {
      "lastReport": [
        {
          "Name": "st01",
          "score": "C"
        },
        {
          "Name": "st02",
          "score": "A"
        },
        {
          "Name": "st03",
          "score": "B"
        }
      ],
      "lastTime": "2018-05-10"
    }
  }
]

Не могли бы вы помочь мне подсчитать значение оценки во всех данных?Мои ожидания - вот такой результат:

[
  {
    "score": "C",
    "Num" : 3
  },
{
    "score": "B",
    "Num" : 2
  },
{
    "score": "A",
    "Num" : 2
  }
  ]

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Как сказал @Sajeetharan, group by пока не поддерживается лазурным космосом db.Тем не менее, я предлагаю вам использовать Stored Procedure для выполнения ваших требований.

Основываясь на ваших образцах документов, я предоставлю вам пример хранимой процедуры.Пожалуйста, обратитесь к ней.

function sample() {
    var collection = getContext().getCollection();
    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT a.score FROM  c join a in c.student.lastReport',
        function (err, feed, options) {
            if (err) throw err;
            if (!feed || !feed.length) getContext().getResponse().setBody('no docs found');
            else {
                var map = {};
                var returnResult = [];
                for(var i = 0;i<feed.length;i++){
                    var s = feed[i].score;
                    if(map.hasOwnProperty(s)){
                        map[s] ++;   
                    }else {
                        map[s] = 1;   
                    }         
                }

                for(var key in map){
                    console.log(key)
                    var obj = {
                        "score":key,
                        "num" : map[key]
                    };
                    returnResult.push(obj);
                }
                getContext().getResponse().setBody(returnResult);
            }
        });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}

Выход:

enter image description here

Надеждаэто помогает тебе.

0 голосов
/ 01 июня 2018

Группировка по не поддерживается изначально в Cosmos DB, поэтому нет никакого готового способа выполнить этот запрос.

Однако существует documentdb-lumenize, который позволяет вам делать это с помощью хранимых процедур.Я не использовал это сам, но это может стоить изучить.

Ссылка:

https://github.com/lmaccherone/documentdb-lumenize

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...