在一个mongoose查询中从2个单独的Mongo文档中获取信息

时间:2017-02-02 17:43:16

标签: node.js mongodb mongoose

我正在使用MongoDb,我有一个带有mongoose(v4.0.1)的工作区架构:

var Workspace = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  userId: {
    type: String,
    required: true
  },
  createdOn: {
    type: Date,
    "default": Date.now
  }
});

用户架构:

var User = new mongoose.Schema({
  email: {
    type: String,
    required: true,
    unique: true
  },
  organisation: {
    type: String,
    required: true
  },
  location: {
    type: String,
    required: true
  },
  verifyString: {
    type: String
  },
  verified: {
    type: Boolean, 
    default: false 
  },
  password: {
    type: String,
    required: true
  },
  createdOn: {
    type: Date,
    "default": Date.now
  },
  isAdmin: {
    type: Boolean, 
    default: false 
  }
});

因此Workspace userIdObjectID文档中的User

当我以管理员身份登录时,我希望获得所有工作区以及拥有工作区的用户的电子邮件。

我正在做的事情变得非常混乱:

Workspace.find({}).exec.then(function(workspaceObects){

   var userPromise = workspaceObects.map(function(workspaceObect){
        // get the user model with workspaceObect.userId here
   });

   // somehow combine workspaceObjects and users

});

以上不起作用,变得非常混乱。基本上我必须遍历workspaceObjects并从工作区userId中检索用户对象。但是,因为它的所有承诺,它变得非常复杂,容易犯错误。

有更简单的方法吗?在SQL中,它需要一个简单的连接。我的架构错了吗?我可以在一个Mongoose查询中获取所有工作区及其用户所有者的电子邮件吗?

2 个答案:

答案 0 :(得分:2)

var Workspace = new mongoose.Schema({  
  userId: {
    type: String,
    required: true,
    ref: 'User'  //add this to your schema
  }  
});

Workspace.find().populate('userId').exec( (err, res) => {
   //you will have res with all user fields
});

http://mongoosejs.com/docs/populate.html

答案 1 :(得分:1)

Mongo没有加入,但是mongoose提供了一个非常强大的工具来帮助你必须稍微更改模型并使用populate:  Mongoose population

您必须对模型进行一些更改,并在工作区模型中获取用户模型的信息。

希望有所帮助