Arhn - архитектура программирования

Объединение вывода Mongo с Node for API

Я действительно новичок в Node, но в настоящее время у меня есть CMS с открытым исходным кодом NodeJS/Express, и я хотел бы вывести некоторые данные API для приложения, над которым я работаю. Простите меня, если я не использую правильную терминологию или еще что-то, это новое для меня.

Сейчас у меня есть две коллекции, локации и туры. CMS позволяет мне создать отношения между ними. Это просто сохраняет массив ObjectID в записи местоположений для каждой связанной записи тура.

Что я хочу сделать, так это взять мой код вывода API (ниже) и заставить его выводить весь массив туров со всеми полями (название, описание и т. д.) для каждой записи местоположения. В настоящее время он выводит только массив идентификаторов.

Вот мой текущий код:

var async = require('async'),
 landmark = require('keystone');

var Location = keystone.list('Location'),
        Tour = keystone.list('Tour');

    /**
     * List Locations
     */
    exports.list = function(req, res) {
        Location.model.find(function(err, items) {

            if (err) return res.apiError('database error', err);

            res.apiResponse({
                locations: items
            });

        });
    }

    /**
     * Get Location by ID
     */
    exports.get = function(req, res) {
        Location.model.findById(req.params.id).exec(function(err, item) {

            if (err) return res.apiError('database error', err);
            if (!item) return res.apiError('not found');

            res.apiResponse({
                location: item
            });

        });
    }

Текущий вывод API (усеченный):

{
  "locations": [
    {
      "_id": "53a47997ebe91d8a4a26d251",
      "slug": "test-location",
      "lastModified": "2014-06-20T20:19:14.484Z",
      "commonName": "test location",
      "__v": 3,
      "url": "",
      "tours": [
        "53a47963ebe91d8a4a26d250"
      ],
      "images": []
    }
  ]
}

Что я ищу:

{
  "locations": [
    {
      "_id": "53a47997ebe91d8a4a26d251",
      "slug": "test-location",
      "lastModified": "2014-06-20T20:19:14.484Z",
      "commonName": "test location",
      "__v": 3,
      "url": "",
      "tours": [
        {
           "_id": "53a47963ebe91d8a4a26d250",
           "title": "my test tour title",
           "url": "url_to_audio_file"
        }
      ],
      "images": []
    }
  ]
}

Кто-нибудь знает, возможно ли это? Любая помощь будет оценена по достоинству! Спасибо!


Ответы:


1

Похоже, вы настроили свою модель Location так, чтобы она содержала ссылку на Tour, определенную как массив Tour. Это означает, что когда вы сохраняете Tour в своем Location, вы сохраняете не данные, представляющие этот Tour, а вместо этого идентификатор, который ссылается на Tour. Когда вы выполняете операцию find, вы видите это в ответе, который вы отправляете обратно клиенту.

Если это так, то вы можете взглянуть на функцию populate Mongoose. Это возьмет эти ссылки и полностью заполнит их данными, которые они содержат.

Так, например, вы можете изменить свой запрос на следующее:

Location.model.find().populate('tours').exec(function(err, items) {
    // items should now contain fully populated tours
}

Дайте мне знать, если это не то, что вы имеете в виду, и я могу попытаться помочь дальше.

21.06.2014
  • Спасибо за ответ. Я разместил этот вопрос на другом форуме, и они предложили то же самое, однако это не работает. Вы правы в том, что предположили, что у меня была моя модель Location для ссылки на Tour. Вот как я ссылаюсь на Tour в модели Location: Location.relationship({ path: 'tours', ref: 'Tour', refPath: 'location' });. populate, похоже, не работает. Вот мой обновленный код, чтобы попытаться получить туры: Location.model.findById(req.params.id).populate({path: 'tours', ref: 'Tour'}).exec(function(err, item) { res.apiResponse({ location: item }); }); 23.06.2014

  • 2

    Решение, предоставленное @dylants, абсолютно правильное. Однако для того, чтобы это работало, вам нужно, чтобы tours было объявлено как поле Types.Relationship в вашем списке Location с параметром ref, установленным на Tour.

    Ознакомьтесь с документацией Keystone в разделе Поля отношений.

    Я включил параметр many: true в приведенный ниже пример, поскольку предположил, что это отношение «один ко многим». Если это не так, вы можете отказаться от него.

    var keystone = require('keystone'),
      Location = keystone.list('Location');
    
    Location.add({
       ...
       tours: { type: Types.Relationship, ref: 'Tour', many: true },
       ...
    });
    

    Упомянутый вами метод List.relationship() предназначен для использования только в том случае, если вы хотите, чтобы список связанных документов автоматически отображался в Keystone Admin UI, а не для установления фактической связи.

    Надеюсь это поможет.

    30.07.2014
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..