MongoDB 文档间的关系
文档间可以通过嵌入和引用来建立联系。MongoDB 中的关系可以是:
-
1:1 (1对1)
-
1: N (1对多)
-
N: 1 (多对1)
-
N: N (多对多)
嵌入式关系
这种数据结构的缺点是,如果用户和用户地址在不断增加,数据量不断变大,会影响读写性能
文档嵌套的数量和深度没有限制,但MongoDB目前版本限制一个文档最大为16MB
{
"name": "Tom",
"address": [
{
"city": "Los Angeles"
},
{
"city": "Chicago"
}]
}
只需要查询一次
db.relation.find(
{"name":"tom"},{"address":1,"_id":0}
)
引用式关系
手动引用
引用式关系是设计数据库时经常用到的方法,这种方法把用户数据文档和用户地址数据文档分开,通过引用文档的 id 字段来建立关系
{
"name":"jack",
"address_id":[
ObjectId("5fcda6c686463b86f2650f78"),ObjectId("5fcda6d086463b86f2650f79")
]
}
需要两次查询,第一次查询用户地址的对象id(ObjectId),第二次通过查询的id获取用户的详细地址信息
var result=db.relation.findOne({"name":"jack"},{"address_id":1})
db.relation.find({"_id":{"$in":result["address_id"]}})
DBRefs
DBRef的形式:
{ $ref : , $id : , $db : }
三个字段表示的意义为:
-
$ref:集合名称
-
$id:引用的id
-
$db:数据库名称,可选参数
{
"name":"hjy",
"address":{
"$db":"test1",
"$ref":"relation",
"$id":ObjectId("5fcda6d086463b86f2650f79")
}
}
DBRef的查询
var user=db.hjy.findOne({"name":"hjy"})
var add=user.address
db[add.$ref].findOne({"_id":add.$id})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具