Вернуть только подмножество потомков из условия - PullRequest
0 голосов
/ 30 октября 2018

Можно ли сделать условный запрос для детей? Я пытаюсь вернуть все группы, со всеми подгруппами (и детьми), где число больше 0. Обратите внимание, что подгруппы имеют детей, которые также должны быть возвращены, если число больше 0.

Документ:

{
  "id": 1,
  "name": "name1",
  "groups": [
    {
      "id": 1,
      "name": "name1",
      "subGroups": [
        {
          "id": 1,
          "name": "name1",
          "count": 4,
          "assests": [ "asset1", "asset2" ]
        },
        {
          "id": 2,
          "name": "name2",
          "count": 0,
          "assests": [ "asset1", "asset2" ]
        }
      ]
    },
    {
      "id": 2,
      "name": "name2",
      "subGroups": [
        {
          "id": 1,
          "name": "name1",
          "count": 4,
          "assests": [ "asset1", "asset2" ]
        },
        {
          "id": 2,
          "name": "name2",
          "count": 0,
          "assests": [ "asset1", "asset2" ]
        }
      ]
    }
  ]
}

Требуется результат:

{
  "id": 1,
  "name": "name1",
  "groups": [
    {
      "id": 1,
      "name": "name1",
      "subGroups": [
        {
          "id": 1,
          "name": "name1",
          "count": 4,
          "assests": [ "asset1", "asset2" ]
        }
      ]
    },
    {
      "id": 2,
      "name": "name2",
      "subGroups": [
        {
          "id": 1,
          "name": "name1",
          "count": 2,
          "assests": [ "asset1", "asset2" ]
        }
      ]
    }
  ]
}

Я пытался сделать это через соединение, но не нашел подход, при котором вы можете пропустить некоторые подгруппы, а не другие. Все предложения приветствуются.

1 Ответ

0 голосов
/ 30 октября 2018

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

function sample() {
    var collection = getContext().getCollection();
    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT * FROM root r',
    function (err, feed, options) {
        if (err) throw err;
        if (!feed || !feed.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {
            var returnArray = [];                      
            for(var i=0 ;i<feed.length;i++){
                var groupsArray = feed[i].groups;
                var map ={};    
                var groups = [];
                for(var j=0 ;j<groupsArray.length; j++){
                    var map1 = {};
                    map1["id"] = groupsArray[j].id;
                    map1["name"] = groupsArray[j].name;

                    var subGroupsArray = groupsArray[j].subGroups;
                    var sub = [];
                    for(var k=0 ;k<subGroupsArray.length;k++){
                        if(subGroupsArray[k].count > 0)
                            sub.push(subGroupsArray[k]);
                    }                    
                    map1["subGroups"] = sub;
                    groups.push(map1);
                }
                map["id"] = feed[i].id;
                map["name"] = feed[i].name;
                map["groups"] = groups;
                returnArray.push(map);
            }
            var response = getContext().getResponse();

            response.setBody(returnArray);

        }
    });

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

Ну, может быть, вы могли бы использовать UDF в запросе SQL. Однако вам все еще нужно зациклить массив в функции udf.

function test(groupsArray){                      
    var map ={};    
    var groups = [];
    for(var j=0 ;j<groupsArray.length; j++){
        var map1 = {};
        map1["id"] = groupsArray[j].id;
        map1["name"] = groupsArray[j].name;

        var subGroupsArray = groupsArray[j].subGroups;
        var sub = [];
        for(var k=0 ;k<subGroupsArray.length;k++){
            if(subGroupsArray[k].count > 0)
                sub.push(subGroupsArray[k]);
        }                    
        map1["subGroups"] = sub;
        groups.push(map1);
    }
    return groups;
}

SQL:

SELECT c.id,c.name,udf.test(c.groups) as groups FROM c
...