2015-05-29 2 views
2

Я использую паруса с mongo db над ватерлинией.Waterline MongoDb (населенный) доставленный объект теряет свой тип И функции прототипа

Позволяет сказать, что я объявляю 2 модели в моих парусах проект так:

Пользователь модель @models/User.js упрощена:

username: { 
     type: 'string', 
     unique: true 
}, 
passports: { 
     collection: 'Passport', 
     via: 'owner' 
}, 

aUserFunction: function(){  
    console.log('I'm a user function'); 
} 

и паспорт модель @models/Passport.js упрощена:

password: { 
     type: 'string' 
}, 

owner: { 
     model: 'User', 
     required: true 
}, 

aPassportFunction: function(){ 
    console.log('I'm a passport function'); 
} 

Пока все хорошо.

Когда я принести одну из этих связанных объектов, которые я делаю это так:

sails.models.user 
.findOne({ username: 'aUsername' }) 
.populate('passports') // The populate method allows you to get associated data 
.exec(function (err, myUser) { 
    ... 
    JSON.stringify(myUser); //The object returns just fine! 
    ... 
} 

Как и ожидалось, вернулся myUser объект это:

{ 
    username:"aUsername", 
    passports: 
    [ 
     { 
      password: 'aPass', 
      owner: 'theUsersId' 
     } 
    ]    
} 

теперь я могу запустить myUser.aUserFunction();, как и ожидалось, поскольку myUser имеет тип models/User.js.

Если я стараюсь, чтобы мои руки на конкретном паспорте я могу это сделать: var passport = myUser.passports[0];

Проблема:

Попытка запустить passport.aPassportFunction(); невозможно, так как возвращаемый объект типа Object и не models/Passport.js.

Теперь, из того, что я знаю, нет типа кастинг в javascript, и это было бы замечательное время для его использования.

Я бы не хотел копировать вставки значений в новый объект, чтобы использовать aPassportFunction(), это кажется пустой тратой ресурсов.

Есть ли другой способ сделать этот общий паспорт Object как models/Passport.js.

ответ

0

MongoDB на самом деле не должны ничего, кроме хранения данных, и поэтому он не должен хранить любые функции:

Problems storing JS functions in Mongo DB with Node.js

Но причина, почему myUser.aUserFunction() работы, я считаю, является потому, что findOne ватерлинии фактически превращает объект в объект водной линии, а не то, что на самом деле хранится в мангодбе. Mongodb вернет вам только плоский файл. Если вы выполните запрос mongodb, вы обнаружите, что ваша заполненная ассоциация даже не существует под родительским объектом.

Таким образом, вы ограничены тем, что позволяет ватерлиния.

Одно предложение вместо того, чтобы использовать ватерлинии один-ко-многим ассоциации, сделать MongoDB один-ко-многим ассоциации вместо:

MyUser.ЯШ:

{ 
    username:"aUsername", 
    passports: 
    [ 
     ObjectId("passportid"), 
     ObjectId("passportid") 
    ]    
} 

Тогда вы сможете использовать findOne ватерлинии на объекте идентификатор паспорта и получить объект Passport.js, вместо объекта user.js с данными только паспорт встроен.

Данные: https://www.safaribooksonline.com/blog/2012/12/18/document-oriented-data-modeling-with-mongodb/