我正在使用mongo db而不是水线的帆。
让我们说我在我的风帆项目中声明了两个模型:
用户模型@ 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 :(得分:0)
mongodb实际上不应该存储除数据之外的任何内容,因此它不应该存储任何函数:
Problems storing JS functions in Mongo DB with Node.js
但我认为,myUser.aUserFunction()
的工作原因是因为水线的findOne实际上将对象转换为水线对象,而不是实际存储在mongodb中的对象。 Mongodb只会返回一个平面文件。如果您执行mongodb查询,您会发现您的填充关联甚至不存在于父对象下。
所以你只能使用水线允许你做的事情。
一个建议是使用水线一对多关联,而不是使用水线一对多关联:
myuser.js:
{
username:"aUsername",
passports:
[
ObjectId("passportid"),
ObjectId("passportid")
]
}
然后,您将能够在护照对象ID上利用水线的findOne并获取Passport.js对象,而不是仅嵌入Passport数据的User.js对象。
详细说明: https://www.safaribooksonline.com/blog/2012/12/18/document-oriented-data-modeling-with-mongodb/