Получить свойства частичного массива - PullRequest
0 голосов
/ 25 июня 2018

Мы храним такие документы:

{
   "FullName": "Jim",
   "Children": [
     {
        "Name": "Sue",
        "Hobbies": [
           {
               "Title": "Stamps",
               "EnthusiasmLevel": 1
           },
           {
               "Title": "Baseball",
               "EnthusiasmLevel": 5
           }
        ]
     },
     {
        "Name": "Frank",
        "Hobbies": [
           {
               "Title": "Dance",
               "EnthusiasmLevel": 3
           },
           {
               "Title": "Juggling",
               "EnthusiasmLevel": 2
           }
        ]
     }
   ]
}

Обычно, когда мы извлекаем эту запись «Джима», мы хотели бы получить полную информацию о нем и его детях, но при определенных обстоятельствах нам понадобится его имя, а также только имя каждого ребенка и название каждого из их детей. хобби.

Существует ли прямой (или нет) способ извлечения только частей этих документов при сохранении (или перестройке на лету) их структуры?

Если я попробую что-то вроде:

SELECT p.FullName, [{"Name": child.Name}] AS Children
FROM People AS p
JOIN child in p.Children

Я могу построить массив, но я (очевидно, за соединение) получаю запись для каждого ребенка вместо одного. Если я вместо этого удаляю объединение и пытаюсь получить доступ к этим свойствам через родительскую коллекцию, я не могу получить их.

Я хочу получить обратно:

{
  "FullName": "Jim",
  "Children": [
     { 
        "Name": "Sue",
        "Hobbies": [
          {"Title": "Stamps"},
          {"Title": "Baseball"}
        ]
     },
     { 
        "Name": "Frank",
        "Hobbies": [
          {"Title": "Dance"},
          {"Title": "Juggling"}
        ]
     }
  ]
}

Даже если бы мне пришлось потерять структуру, я все равно хотел бы вернуть единственную запись, представляющую «Джима», которая содержит имена и увлечения его детей, но сейчас я просто извлекаю все и выполняю фильтрацию на клиентская сторона, что не идеально.

Что я после возможного?

1 Ответ

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

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

Пример кода:

function sample() {
    var collection = getContext().getCollection();

    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT p.FullName, p.Children FROM People AS p',
    function (err, feed, options) {
        if (err) throw err;
        if (!feed || !feed.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {
            var response = getContext().getResponse();
            var returnResult = [];
            for(var i = 0;i<feed.length;i++){
                var peopleObj = feed[i];
                ChildrenArray = [];               
                for(var j = 0;j<peopleObj.Children.length;j++){
                    console.log(j)
                    var childObj = peopleObj.Children[j];
                    HobbiesArray = [];
                    for(var k = 0; k < childObj.Hobbies.length;k++){
                        var hobbyObj = childObj.Hobbies[k];
                        map ={};
                        map["Title"] = hobbyObj.Title;
                        HobbiesArray.push(map);
                    }
                    childObj.Hobbies = HobbiesArray;
                }
                ChildrenArray.push(childObj);
            }
            returnResult.push(peopleObj);
            getContext().getResponse().setBody(returnResult);
        }
    });

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

Выход:

[
    {
        "FullName": "Jim",
        "Children": [
            {
                "Name": "Sue",
                "Hobbies": [
                    {
                        "Title": "Stamps"
                    },
                    {
                        "Title": "Baseball"
                    }
                ]
            },
            {
                "Name": "Frank",
                "Hobbies": [
                    {
                        "Title": "Dance"
                    },
                    {
                        "Title": "Juggling"
                    }
                ]
            }
        ]
    }
]

Любая проблема, пожалуйста, дайте мне знать.

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