Mongoose - 从多个集合中获取数据

时间:2016-03-07 10:56:04

标签: node.js mongodb mongoose

我想在nodejs应用程序中获取数据,如下所述 user.js,userProfile是mongoose的模型。

user.js的

    var userSchema = new Schema({
         nick_name:{type:String},
         email: {type: String},
         password: {type: String},
        is_active:{type:String,enum:['1','0'],default:"1"},
    },{ collection: 'user'});

userProfile.js

    var userProfileSchema = new Schema({
        user_id:{type:Schema.Types.ObjectId, ref:'User'},
        first_name:{type:String},
        last_name:{type:String},
        address:{type:String},
        country:{type:String},
        state:{type:String},
        city:{type:String},
        gender:{type:String,enum:['m','f','o'],default:"m"},
        is_active:{type:String,enum:['1','0'],default:"1"},
    },{ collection: 'userProfile'});

想按照以下方式退出

    {
     "nick_name"   : "laxman",
     "email"       : "laxman@mailinator.com",
     "first_name"  : "my first name",
     "last_name"   : "my last name",
     "address"     : "my address",
     "country"     : "my country",
     "state"       : "my state",
     "city"        : "my city",
     "gender"      : "m",
    }

依赖关系

    "express"  => "version": "4.7.4",
    "mongoose" => "version": "4.4.5",
    "mongodb"  => "version": "2.4.9",
    "OS"  => "ubuntu 14.04 lts 32bit",

SQL查询供参考

SELECT * FROM `user`  
       left join `user_profile` 
       on user.id =user_profile.user_id 
WHERE 1

1 个答案:

答案 0 :(得分:0)

这个问题的答案取决于你如何进行身份验证,但我会回答这个问题,我将如何实现你的要求。

首先,我会制作一个Schema而不是两个单独的Schema。然后,取决于您的身份验证方法,我使用令牌,您将把数据传递给客户端接收的任何数据。它还有助于了解您是否在客户端使用处理HTTP请求的任何内容,或者这只是一个节点应用程序。

我将尝试详细介绍这两种方法。

假设您正在使用Cookie,我将假设您知道如何使用Express建立会话,或者您在节点之上使用的任何框架,以及假设您知道自己是什么尽可能正确地保护您的密码并直接跳到api大楼。

假设这是服务器端的控制器,用于在登录时对用户进行身份验证。

var User = mongoose.model('User');

exports.login = function (req, res) {
    User.findOne({email: req.body.email), function (err, user) {
        if (err) {
            return res.json(err);
        } else if (!user) {
            return res.json({message: 'User not found.'});
        } else {
          if (req.body.password === user.password) {
              req.session.user = user;
          } else {
            return res.json({message: 'Invalid username or password.'});
          }
        }
      )};
     };

当然,您要确保设置了一些中间件,因此密码绝对不会随用户一起发送,但这不是问题所在。

一旦你有了,那么你需要用户数据的任何其他路线都相当简单。你制作另一个控制器:

exports.profile = function (req, res) {
 if (req.session && req.session.user) {
    User.findOne({email: req.session.user.email}, function (err, user) {
      if (!user) {
          res.session.reset();
          res.redirect('/login');
      } else {
        res.locals.user = user;
        res.render('/profile);
      }
    )};
   }
  };

我在服务器端进行了渲染,但是如果你使用像Angular这样的东西,你可以把它拉到客户端。

如果您使用的是我强烈推荐的令牌,那么该方法非常相似。我也很乐意解释其中的一些内容。