Mongoose/mongoDB 查询加入.. 但我来自 sql 背景
Posted
技术标签:
【中文标题】Mongoose/mongoDB 查询加入.. 但我来自 sql 背景【英文标题】:Mongoose/mongoDB query joins.. but I come from a sql background 【发布时间】: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
);
谢谢!
【问题讨论】:
【参考方案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
,这是否意味着需要保持严格的命名约定?
大神解答!!很聪明以上是关于Mongoose/mongoDB 查询加入.. 但我来自 sql 背景的主要内容,如果未能解决你的问题,请参考以下文章
从两个数据库集合(Mongoose/MongoDB)中查询和匹配