水线MongoDb(填充)获取对象失去了它的类型和原型函数



我在水线上使用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/

相关内容

  • 没有找到相关文章

最新更新