水线MongoDb(已填充)获取的对象将丢失其类型和原型函数

时间:2015-05-29 10:12:25

标签: javascript casting sails.js waterline sails-mongo

我正在使用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类型。

1 个答案:

答案 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/