我在水线上使用mongo db帆
假设我在我的sails项目中声明了两个模型,如下所示:
用户模型@ 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
类型?
mongodb实际上不应该存储数据以外的任何东西,所以它不应该存储任何函数:
使用Node.js在mongodb中存储JS函数的问题
但myUser.aUserFunction()
工作的原因,我相信,是因为水线的findOne实际上将对象转换为水线对象,而不是实际存储在mongodb中的内容。Mongodb只会返回一个平面文件。如果你做一个mongodb查询,你会发现你填充的关联甚至不存在于父对象下。
所以你被限制在水线允许的范围内。
一个建议是不要使用水线一对多关联,而是使用mongodb一对多关联:
myuser.js:
{
username:"aUsername",
passports:
[
ObjectId("passportid"),
ObjectId("passportid")
]
}
然后你就可以在护照对象id上利用waterline的findOne并获得passport .js对象,而不是只嵌入了护照数据的User.js对象。
细节:https://www.safaribooksonline.com/blog/2012/12/18/document-oriented-data-modeling-with-mongodb/