【问题标题】:Mongoose/mongoDB query joins.. but I come from a sql backgroundMongoose/mongoDB 查询加入.. 但我来自 sql 背景
【发布时间】:2012-12-31 01:07:19
【问题描述】:

我来自 sql 背景,所以在我加入表的 sql 中编写查询非常简单,但我想我在 mongoose/mongodb 中缺少这一点

基本上我知道 Subscriber_ID(映射到用户集合中的文档)

我想拉出项目组,包含用户所属的所有项目,所以如果我用 pseduo sql 编写它会是这样的

Select 
  ProjectGroup.title, 
  Project.Title 
FROM 
  ProjectGroup, 
  Project, 
  User 
WHERE 
  User.id = req.body.subscriber_id 
  AND Project.subscriber_id = User.id 
  AND  ProjectGroup.project_id = Project.id

必须有一种方法可以在 mongoose/mongodb 中进行类似的连接,因为类型正在映射到模式,对吗?

我的架构.....

项目组架构

var ProjectGroupSchema = new Schema({
    title             : String
  , projects          : [ { type: Schema.Types.ObjectId, ref: 'Project' } ]
});

项目架构

var ProjectSchema = new Schema({
    title         : {type : String, default : '', required : true}
  , subscribers   : [{ type: Schema.Types.ObjectId, ref: 'User' }]
});

用户架构

var UserSchema = new Schema({
    first_name    : {type: String, required: true}
  , last_name     : {type: String, required: true}
});

谢谢!

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    Mongodb 中没有连接。这个问题我认为是一个很好的参考:

    MongoDB and "joins"

    总而言之,对于将通过关系数据库中的连接解决的问题,mongodb 必须采用不同的策略。我会说你最终主要做以下两件事之一:

    • 嵌入:您将信息嵌入到单个文档中,该文档将在关系数据库中分布在不同的表中。
    • 加入信息客户端:当你需要使用来自多个地方的信息时,你会多次查询,然后在你的客户端中拼凑起来。

    【讨论】:

    • 是的,这是一个很好的解释它的帖子......现在是时候实施了!
    【解决方案2】:

    你只有一步之遥!

    项目组架构:

    var ProjectGroupSchema = new Schema({
        title             : String
    });
    

    项目架构:

    var ProjectSchema = new Schema({
        title         : {type : String, default : '', required : true},
        group         : {type: Schema.Types.ObjectId, ref: 'ProjectGroup' },
        _users    : [{type: Schema.Types.ObjectId, ref: 'User' }]
    });
    

    用户架构:

    var UserSchema = new Schema({
        first_name    : {type: String, required: true},
        last_name     : {type: String, required: true},
        subscribing   : [{type: Schema.Types.ObjectId, ref: 'Project' }]
    });
    

    然后您可以执行以下操作:

    user.findById(req.userId)
         .populate('subscribing')
         .exec(function(err, user){
              console.log(user.subscribing);
         })
    

    或者:

    project.find({
            subscriber : req.userId
          })
         .populate('subscriber')
         .populate('group')
         .exec(function(err, projects){
              console.log(projects);
         })
    

    【讨论】:

    • 非常有趣,我将应用它并看看它是如何工作的,但你提到的第二个看起来正是我需要的。
    • 好的,我刚刚更新了我的架构引用并完美地使用了这些填充!
    • 这太棒了,但是你能不能修改 exec 的返回结果,比如我不想包含 group 字段。
    • 我有点不知所措,因为它知道在哪里“加入”什么。这就是ref 属性的用途吗? mongoose 的populate 是否根据引用为Project 来查找ProjectSchema,这是否意味着需要保持严格的命名约定?
    • 大神解答!!很聪明
    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    相关资源
    最近更新 更多