您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

mongodb 文档的嵌入和引用

2024/4/25 1:57:41发布4次查看
mongodb 是介于关系型与非关系型数据之间的,mongodb的join查询可以通过引用来实现。可以将文档内容嵌入到另一个文档中,也可以将文档内容引用到另一个文档中。嵌入意味着要把某一类型的数据,如包含更多数据的数组,嵌入到文档本身。引用意味着创建一个引用
mongodb 是介于关系型与非关系型数据之间的,mongodb的join查询可以通过引用来实现。可以将文档内容嵌入到另一个文档中,也可以将文档内容引用到另一个文档中。嵌入意味着要把某一类型的数据,如包含更多数据的数组,嵌入到文档本身。引用意味着创建一个引用,包含另一个文档的数据。相当于关系型数据库。一. 嵌入例如:我想使用一个关系型数据库来记录cd、dvd和购买信息。在这个数据中,需要一个表来收集cd,另一个表来存储cd歌曲信息。因此,如果要查询特定的信息就可能需要查询多个表的。对于mongodb 或者其他非关系型数据库,会更容易的嵌入这些信息,采用这种方法会使数据库简洁,确保所有相关信息保存在单一的文档中,同时,检索数据更快。数据结构如下:关系型|_media |_cds |_id, artist, title, genre, releasedate |_ cd_tracklists |_cd_id, songtitle, length
非关系型|_media |_items |_
对于非关系型,文档看起来如下所示[ { _id : objectid(5353463193efef02c962da73), type : cd, artist : nirvana, title : nevermind, tracklist : [ { track : 1, title : smells like teen spirit, length : 5:02 }, { track : 2, title : in bloom, length : 4:15 } ] }]
上面这个例子中,歌曲信息嵌入到文档本身中,在关系型数据库中至少需要两个表,在非关系型数据库中,仅需要一个集合和一个文档。在检索信息时,只需要数据从一个文档加载到内存中,而不必加载多个文档。二. 引用在很多场景下,把数据嵌入到文档足以满足很多应用程序,如上所示。然而,有时就需要引用另一个文档。在mongodb中的文档引用是通过执行额外的查询来解决的。mongodb提供两种方式来实现:手动引用和使用dbref标准。2.1 手动引用手动引用是最简单最直接的方式。当手动引用数据时,将其他文档的_id值存储在你的文档中。实例如下:> use ttlsa_comswitched to db ttlsa_com> apress = ( { _id : apress, type : technical publisher, category : [it, software,programming] } ){ _id : apress, type : technical publisher, category : [ it, software, programming ]}> db.publisherscollection.insert(apress)
引用> book = ( { type : book, title : definitive guide to mongodb, the, isbn : 987-1-4302-3051-9, publisher : apress,author : [membrey,peter,plugge, eelco,hawkins, tim] } ){ type : book, title : definitive guide to mongodb, the, isbn : 987-1-4302-3051-9, publisher : apress, author : [ membrey,peter, plugge, eelco, hawkins, tim ]}> db.mediacollection.insert(book)
检索> book = db.mediacollection.findone({isbn : 987-1-4302-3051-9}){ author : [ hawkins, tim, plugge, eelco ], isbn : 987-1-4302-3051-9, publisher : apress, title : different title 2, type : book, _id : objectid(5353462f93efef02c962da71)}> book.publisherapress> db.publisherscollection.findone( { _id : book.publisher } ){ _id : apress, type : technical publisher, category : [ it, software, programming ]}
2.2?dbrefdbref提供了一个更正式的规范引用文档之间的数据。在dbref中,数据库引用以标准的json/ bson嵌入对象存储的。语法:?{ $ref : , $id : [, $db : ] }代表引用的集合的名称。所引用的文档的_id值。$ db是可选的,引用的文档所在的数据库的名称。 > apress = ( { type : technical publisher, category :[it,software,programming] } ){ type : technical publisher, category : [ it, software, programming ]}> db.publisherscollection.save(apress)> apress{ type : technical publisher, category : [ it, software, programming ], _id : objectid(53588c221697e7511678752c)}> book = { type : book, title : definitive guide to mongodb, the, isbn : 987-1-4302-3051-9, author: [membrey, peter,plugge,eelco,hawkins, tim], publisher : [ new dbref ('publisherscollection',apress._id) ] }{ type : book, title : definitive guide to mongodb, the, isbn : 987-1-4302-3051-9, author : [ membrey, peter, plugge,eelco, hawkins, tim ], publisher : [ dbref(publisherscollection, objectid(53588c221697e7511678752c)) ]}> db.media.save(book)> db.media.find().toarray()[ { _id : objectid(53588ce01697e7511678752d), type : book, title : definitive guide to mongodb, the, isbn : 987-1-4302-3051-9, author : [ membrey, peter, plugge,eelco, hawkins, tim ], publisher : [ dbref(publisherscollection, objectid(53588c221697e7511678752c)) ] }]
三. 比较嵌入 :小的子文档数据不经常改变当最终一致性是可以接受的文档增长小经常需要进行二次查询来获取数据读快引用 :大的子文档非易失性数据当实时一致性是必要的文档增长大经常需要从结果中排除数据写快 原文地址:mongodb 文档的嵌入和引用, 感谢原作者分享。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录