设为首页 收藏本站
查看: 1706|回复: 0

[经验分享] mongodb指南(翻译)(十四)

[复制链接]
YunVN网友  发表于 2015-7-9 08:01:44 |阅读模式
  由于mongodb是非关系型的(没有连接(join)),文档间的引用(“外键”)通常是在客户端通过向服务器进行额外查询来解决的(linking)。
  这些连接总是在客户端解决的。直接/手动做这些是非常容易并且也是推荐这样做的。
  这里还有一个很多驱动都支持的DBRef机制,它在一定程度上抽象了linking的概念。推荐的方法是使用直接/手动link
  内嵌对象是对linking的一种备选方案并且很多时候它非常合适和表现优秀。
  简单的直接/手动linking
  通常,手动编写link解决方案就可以很好工作并且也很简单。我们存储_id中的值到数据库的其他文档,稍后对它进行查询。例如:



> // grab a random blog post:
> p = db.postings.findOne();
{
"_id" : ObjectId("4b866f08234ae01d21d89604"),
"author" : "jim",
"title" : "Brewing Methods"
}
> // get more info on author of post p. this is the "linking" step.
> a = db.users.findOne( { _id : p.author } )
{ "_id" : "jim", "email" : "jim@gmail.com" }
> // inverse: given an author, find all blog posts for the author
> db.postings.find( {author : a._id } )
  DBRef
  DBRef是一种创建文档间引用的更加正式的规范。DBRefs(通常)除了对象id外还包含一个集合名称。大多数开发者只在文档中的集合可以改变为其他的时候才使用DBRef。如果你引用的集合总是相同的,那么上面描述的手动引用会更加高效。
  DBRef是在同一个数据库中一个文档对另一个文档的引用。一个数据库引用是标准的内嵌(JSON/BSON)对象:我们定义的一种约定,不是一个特殊类型。通过使用标准方法来表现,驱动和数据框架可以添加助手方法按照标准方法来操作引用。
  在某些驱动中DBRef有一个优点,允许可选的原子性的客户端解引用。在很多场景中,你可以只是把_id存储为引用,然后按照前面“简单手动引用”章节所说进行解引用。
  DBRef引用值的语法是:



{ $ref : , $id : [, $db : ] }
  是被引用的集合名(没有数据库名),是引用对象的字段_id的值。$db是可选的(目前大部分驱动还不支持)并且允许引用的文档是其他数据库的(由指定)。
  
  不同语言/驱动中的DBRef
  C#
  使用DBRef类。构造函数的参数是集合名和_id。然后你可以使用Database类中的FollowReference方法来获取引用文档。
  C++
  c++驱动尚没有提供方法来自动遍历DBRefs。当然你还是可以手动来完成的。
  Java
  java使用DBRef类支持DB引用。
  Javascript(mongo shell)
  例子:



> x = { name : 'Biology' }
{ "name" : "Biology" }
> db.courses.save(x)
> x
{ "name" : "Biology", "_id" : ObjectId("4b0552b0f0da7d1eb6f126a1") }
> stu = { name : 'Joe', classes : [ new DBRef('courses', x._id) ] }
// or we could write:
// stu = { name : 'Joe', classes : [ {$ref:'courses',$id:x._id} ] }
> db.students.save(stu)
> stu
{
"name" : "Joe",
"classes" : [
{
"$ref" : "courses",
"$id" : ObjectId("4b0552b0f0da7d1eb6f126a1")
}
],
"_id" : ObjectId("4b0552e4f0da7d1eb6f126a2")
}
> stu.classes[0]
{ "$ref" : "courses", "$id" : ObjectId("4b0552b0f0da7d1eb6f126a1") }
> stu.classes[0].fetch()
{ "_id" : ObjectId("4b0552b0f0da7d1eb6f126a1"), "name" : "Biology" }
>
  Perl
  perl驱动没有提供方法自动遍历DBRefs,但是有一个CPAN包:MongoDBx::AutoDeref.当然你还可以手动遍历他们。
  PHP
  除了在数据库层面(MongoDB::createDBRef和MongoDB::getDBRef)和集合层面(MongoCollection::createDBRef和MongoCollection::getDBRef)的创建和解引用方法外,PHP还提供了MongoDBRef类来支持DB引用。
  Python
  在python中使用bson.dbref.DBRef类来创建一个DB引用。你还可以使用Database实例中的dereference方法让解引用变得更加容易。
  Ruby
  Ruby也使用DBRef类和DB实例中的dereference方法来支持DB引用。例如:



@db = Connection.new.db("blog")
@user = @db["users"].save({:name => "Smith"})
@post = @db["posts"].save({:title => "Hello World", :user_id => @user.id})
@ref = DBRef.new("users", @post.user_id)
assert_equal @user, @db.dereference(@ref)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-84506-1-1.html 上篇帖子: mongodb指南(翻译)(十九) 下篇帖子: 我与mongodb 二三事(5)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表