Двухуровневая популяция мангустов с использованием KeystoneJs

Мне нужно заполнить два уровня вниз с помощью Mongoose / Keystone, но я столкнулся с препятствием.

У меня 3 модели: Регион, Страна и Город. Регионы содержат страны, а страны содержат города.

Мои модели:

Регион модели:

var Region = new keystone.List('Region');

Region.add({
      name: {type: Types.Text}
    , countries: {type: Types.Relationship, ref: 'Country', many: true}
});

Страна модели

var Country = new keystone.List('Country');

Country.add({
      name: {type: Types.Text}
    , cities: {type: Types.Relationship, ref: 'City', many: true}
});

Образцовый город

var City = new keystone.List('City');

City.add({
      name: {type: Types.Text}
});

Запрос:

keystone.list('Region').model.find()
    .populate('countries')
    .exec(function(err, regions){
        console.log(regions)
    });

Урожайность:

    {
        name: 'Oceania',

        countries: [
            {
                _id: 55d9b260415baa6958ac04c1   
                name: 'Australia',
                cities: [
                    _id: 55d9b260415baa6958ac04c2,
                    _id: 55d9b260415baa6958ac04c3,
                    _id: 55d9b260415baa6958ac04c4
                ]
            },

                {
                _id: 55d9b260415baa6958ac04c5
                name: 'New Zealand',
                cities: [
                    _id: 55d9b260415baa6958ac04c6,
                    _id: 55d9b260415baa6958ac04c7
                ]
            }
        ]
    },

    {
        name: 'Americas',
        countries: [
            {
                _id: 55d9b260415baa6958ac04c1   
                name: 'USA',
                cities: [
                    _id: 55d9b260415baa6958ac04d2,
                    _id: 55d9b260415baa6958ac04d3,
                    _id: 55d9b260415baa6958ac04d4
                ]
            },

                {
                _id: 55d9b260415baa6958ac04c5
                name: 'Canada',
                cities: [
                    _id: 55d9b260415baa6958ac04e6,
                    _id: 55d9b260415baa6958ac04e7
                ]
            }
        ]
    }
]

Как бы я заселил города? Насколько я понимаю, Mongoose не поддерживает глубокое заселение.

Могу ли я запросить результаты тогда или как?


person ChrisRich    schedule 24.08.2015    source источник
comment
он не может быть дубликатом, потому что запросы keystone.js разные   -  person enRaiser    schedule 28.08.2016


Ответы (1)


В мангусте вы можете сделать так:

regionModel.find().populate("countries").exec(function(err, regions){

    if(err){
        throw err;
    }

    // Regions with populate countries
    cityModel.populate(regions, {
        path: 'countries.cities',
        select: '_id name'
    },function(err, regions) {

        //Regions with Countries and Populated Cities

    });

})

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

keystone.list('Region').model.find()
        .populate('countries')
        .exec(function(err, regions){

            if(err){
                throw err;
            }

            keystone.list('City').model.find()
                    .populate('cities')
                    .exec(function(err, regions){
                        console.log(regions)
                    });

        });
person Hiren S.    schedule 24.08.2015
comment
Замечательный! Спасибо за ответ. Я был довольно близко и почти там. Ценю твою помощь. - person ChrisRich; 24.08.2015
comment
как это вообще возможно, ясно, что приведенный выше код синтаксически неверен для kewystone. поэтому, если вы думаете, что это сработало, можете ли вы поместить фактический код, связанный с трапецеидальным искажением - person enRaiser; 28.08.2016
comment
.populate({путь: 'страны', заполнить: {путь: 'города', } }) - person Sefi Grossman; 20.07.2017