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);
});
Другие вопросы по тегам