2013-03-20 2 views
3

Можно ли автоматически запускать populate() для ссылочных поддокументов для конкретной модели?Автоматически заполнять() на Mongoose document fetch

У меня есть модель города, которая ссылается на документы в Регионе и стране, которые я хотел бы автоматически заполнить, когда город/города будут извлечены.

ответ

1

Ну, на сайте Mongoose нет документов. что я делаю что-то вроде этого:

schema.statics.createQuery = function(populates) { 
    var query = this.find(); 
    populates.forEach(function(p) { 
     query.populate(p); 
    }); 

    return query; 
}; 

Конечно, есть подтверждение и некоторые другие вещи в этом методе, но, по сути, это то, что я делаю со своими моделями.

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

+0

Это определенно интересный способ сделать это и работает на верхнем уровне находит, мне очень интересно, если есть способ, который будет работать для вложенных ссылок выборки. Например, у меня также есть модель под названием «Бизнес», которая имеет поле адреса и ссылку на «Город». Мне также хотелось бы, чтобы, когда бизнес был выбран, он автоматически заполняет город, что, в свою очередь, автоматически заполнит регион и страну, как в исходном вопросе. – nullfox

+0

Я еще не проверил это очень хорошо, но что вы могли бы сделать, это вызвать 'populate()' для каждого экземпляра документа после того, как вы его запустите. Но будьте осторожны, что это может быть дороже, чем вам действительно нужно. – gustavohenke

+0

Я люблю MongoDB и Mongoose и Node.js, но похоже, что здесь не так много лишних запросов? Раньше я много работал с MySQL, и есть только совместное мероприятие и однократное путешествие. Надеюсь, что MongoDB может сделать внутренне, чтобы исправить это. –

0

AFAIK нет способа автоматически заполнить все ссылки на другую модель из коробки (есть плагины, хотя). Аналогично тому, как @ gustavohenke отвечает, вы можете использовать статичность, а также небольшое изменение вашего запроса на поиск.

Вот что я хотел бы сделать:

citySchema.statics.fieldsToPopulate = function() { 
    return ['regionField', 'countryField']; 
}; 

Где regionField и countryField являются поля, которые ссылаются на эти модели Region и Country соответственно.

Тогда в запросе можно заполнить соответствующим образом:

var populate = city.fieldsToPopulate ? city.fieldsToPopulate() : []; 

city.findById(id) 
    .populate(populate) 
    .exec(function(err, data) { 
     if (err) { 
     return next(err); 
     } else { 
     res.render('template', { city: data }); 
     } 
    }); 
Смежные вопросы