mongoosejs: заполнение массива objectId из разных схем
Я проверяю идею и сделал несколько надуманных примеров для обсуждения.
У меня есть следующие модели схемы:
var outerSchema = new Schema({
title: String,
refD: [{type: Schema.ObjectId, ref: 'InnerOne'},
{type: Schema.ObjectId, ref: 'InnerTwo'}]
});
var innerOneSchema = new Schema({
title: String
});
var innerTwoSchema = new Schema({
turtle:String
});
var Outer = mongoose.model('Outer', outerSchema);
var InnerOne = mongoose.model('InnerOne', innerOneSchema);
var InnerTwo = mongoose.model('InnerTwo', innerTwoSchema);
Я успешно протолкнул пример каждого из них в Монго. Это привело к появлению трех коллекций с массивом refD, который включает в себя ObjectId объектов innerOne и innerTwo, которые выглядят хорошо с точки зрения Монго:
{
"_id" : ObjectId("56625b7c752995f505637864"),
"title" : "LOOK AT MY CHILDREN!",
"refD" : [
ObjectId("56625b7c752995f505637862"),
ObjectId("56625b7c752995f505637863")
],
"__v" : 1
}
Однако, когда я использую команду populate так:
Outer
.findOne({title: 'LOOK AT MY CHILDREN!'})
.populate('refD')
.exec(function(err,res){
if(err) console.log(err);
console.log(res);
});
Результат выглядит следующим образом:
{ refD:
[ { __v: 0,
title: 'Im the first type inside!',
_id: 56625b7c752995f505637862 } ],
__v: 1,
title: 'LOOK AT MY CHILDREN!',
_id: 56625b7c752995f505637864 }
Таким образом, структурно это правильно, однако похоже, что функция заполнения заполнила только первый из двух типов.
Я раздвигаю границы того, что можно выполнить, или есть способ справиться с населением разных объектов?
Я подумывал об использовании дискриминаторов, чтобы сделать ВСЕ модели дочерними для одного родительского класса, но я бы предпочел этого не делать, если я сделаю это, я также могу использовать реляционную базу данных.
------ РЕДАКТИРОВАТЬ ------ На данный момент не похоже, что это выполнимо без изменения или создания плагина.
Для тех, кто думал о том же, что я решил сейчас, я вернусь к более традиционному подходу: я создал relatedRecordSchema, который хранит Id, тип записи и некоторые другие полезные метаданные. Это существенно продвигает логику для населения до приложения.
В моем случае это не так плохо, так как я не всегда хочу заполнять все различные связанные записи, но чтобы приложение или пользователь решали на лету.
Это не ответ, поэтому я оставлю вопрос открытым, надеясь, что кто-то проявит инициативу и создаст плагин;)
Приветствия B
1 ответ
Насколько мне известно, заселение работает для одной схемы. Вы можете попробовать запустить заполнение два раза до 'refD', указав другой параметр модели.
Больше информации о населенном пункте: Население мангуста
Я не проверял это до конца, но возможный способ решить эту проблему:
Outer
.findOne({title: 'LOOK AT MY CHILDREN!'})
.populate({
path: 'refD',
model: 'InnerOne'
})
.populate({
path: 'refD',
model: 'InnerTwo'
})
.exec(function(err,res){
if(err) console.log(err);
console.log(res);
});