MongoDB   发布时间:2022-05-23  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了mongodb 关系、引用、覆盖索引查询大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

一、关系

  MongoDB 的关系表示多个文档之间在逻辑上的相互联系。文档间可以通过嵌入和引用来建立联系。MongoDB 中的关系可以是:1对1,1对多多对1,多对多。

一个用户可以用多个地址,这是典型的一对多关系。

  user文档可以是:

{
   "_ID":ObjectID("52ffc33cd85242f436000001"),"name": "Tom Hanks","contact": "987654321"
}

  address文档可以是:

{
   "_ID":ObjectID("52ffc4a5d85242602e000000"
} 

  1、嵌入式关系

  使用嵌入式方法,可以把地址文档嵌入到用户的文档中

{
    "_ID":ObjectID("52ffc33cd85242f436000001": [
      {
         "building": "22 A,1)">
      },{
         "building": "170 A,Acropolis Apt"
      }]
} 

  如果这样保存的话可以这样获取用户的地址:

db.users.findOne({"name":"Tom Benzamin"},{"address":1})

 

  @R_262_6491@的缺点是,如果用户和用户地址在不断增加,数据量不断变大,会影响读写性能。

 

  2、引用式方法

  这种方法类似于关系型数据库中的外键,将address的_ID存到user文档中

  

: [
      ObjectID("52ffc4a5d85242602e000000"jectID("52ffc4a5d85242602e000001")
   ]
}

  我们可以读取这些用户地址的对象ID(ObjectID)来获取用户的详细地址信息。这种方法需要两次查询,第一次查询用户地址的对象ID(ObjectID),第二次通过查询的ID获取用户的详细地址信息。

  

var result = db.users.findOne({"name":"Tom Benzamin"},{"address_IDs":1})
var addresses = db.address.find({"_ID":{"$in":result["address_IDs"]}})

 

二、数据库引用

  mongodb的引用有两种:手动引用(Manual References)与 DBRefs

  如果我们在不同的集合中 (address_home,address_office,address_mailing,等)存储不同的地址(住址,办公室地址,邮件地址等)。这时候我们在调用不同地址时,也需要指定集合,一个文档从多个集合引用文档,我们应该使用 DBRefs。

  DBRef的形式:

{ $ref :,$ID :,$db :  }

  其中$ref:集合名称,$ID:引用的ID,$db:数据库名称(可选)。

  以下实例中用户数据文档使用了 DBRef,字段 address:

{
   "_ID":ObjectID("53402597d852426020000002": {
   "$ref": "address_home"jectID("534009e4d852427820000002"},1)">
}

  address DBRef 字段指定了引用的地址文档是在 address_home 集合下的 w3cschoolcc 数据库,ID 为 534009e4d852427820000002。

  以下代码中,我们通过指定 $ref 参数(address_home 集合)来查找集合中指定ID的用户地址信息:

var user = db.users.findOne({"name":"Tom Benzamin"var dbRef = user.address
db[dbRef.$ref].findOne({"_ID":(dbRef.$ID)})

  以上实例返回了 address_home 集合中的地址数据:

{
   "_ID" : ObjectID("534009e4d852427820000002"
}

 

三、覆盖索引查询

  覆盖查询是以下的查询:

  • 所有的查询字段是索引的一部分
  • 所有的查询返回字段在同一个索引

  

  由于所有出现在查询中的字段是索引的一部分, MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询结果。因为索引存在于RAM中,从索引中获取数据比通过扫描文档读取数据要快得多。

  例:user集合:

{
   "_ID": ObjectID("53402597d852426020000002"gender": "M"user_name": "tombenzamin"
}

  创建联合索引,字段为gender和user_name

db.users.ensureIndex({gender:1,user_name:1})

  现在,该索引会覆盖以下查询:

db.users.find({gender:"M"},{user_name:1,_ID:0})

  对于上述查询,MongoDB的不会去数据库文件中查找。相反,它会从索引中提取数据,这是非常快速的数据查询。由于我们的索引中不包括 _ID 字段,_ID在查询中会默认返回,我们可以在MongoDB的查询结果集中排除它。下面的实例没有排除_ID,查询就不会被覆盖:

db.users.find({gender:"M"},{user_name:1})

  如果所有索引字段是一个数组则不能使用覆盖索引查询,所有索引字段是一个子文档。

 

大佬总结

以上是大佬教程为你收集整理的mongodb 关系、引用、覆盖索引查询全部内容,希望文章能够帮你解决mongodb 关系、引用、覆盖索引查询所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: