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

[经验分享] mongodb笔记(一) 分片 &&文档连接

[复制链接]

尚未签到

发表于 2017-12-16 06:16:14 | 显示全部楼层 |阅读模式
  版本:mongodb3.4 ;
  分片:
  工作顺序:router=>config=>shards
  一,配置config:
  3.4中config必须为replSet。下面配置两个config。
  mongod --configsvr -dbpath= ..   -logpath=..   replSet=myConfig -port=3001 --fork;
  mongod --configsvr -dbpath=..    -logpaht=..  replSet=myConfig  -port=3002 --fork;
  进入config,mongo --port 3001,配置副本集:
  var config={
  _id:'myConfig',
  configsvr:true,
  memeber:[{_id:0,host:155.155.1.104:3001},   {_id:0,host:155.155.1.104:3002}]
  }
  rs.initiate(config);
  官方建议三个,我们这里只有两个。host,不能为127.0.0.1,或者localhost。所以我配置为局域网的地址了。
  二,配置shard:
  mongod --shardsvr dbpath=.. -logpath=.. -port=4001 -nojournal --fork
  mongod --shardsvr dbpath=..  -logpath=.. -port=4002 -nojournal --fork
  生存环境下建议shard为replSet,这里姑且就为mongod吧
  三,配置router:
  mongos -configdb=myConfig/155.155.1.104:3001,155.155.1.104:3002 -port=3000
  将config副本集写进去
  四,定义shard:
  进入mongos :
  mongo -host=155.155.1.104  -port=3000
  use admin;
  添加分片:
  sh.addShard( '155.155.1.104:4001');   sh.addShard('155.155.1.104:4002');
  激活一个db:
  sh.enableSharding('test');
  为该db中的collection添加规则:
  sh.shardCollection('test.collection1',{_id:'hashed'})
  文档连接:
  文档引用
  官方使用的方法,将一个document 的field指向另一个document的_id。
  树形结构:
  子定义一个parent。父定义一个children。将子父的一个filed放入其中。可以建立索引。更遥远的可以定义ancestor。
  树形路径:
  定义document的一个filed为string型  ',path,path1,path2'。根据树形结构,写放路径。
  二叉树路径:
  每个document,拥有一个left,right为number型。根据left,right和二叉树结构,可以遍历其子document。
  数据引用:
  将document的一个filed定义为DBRef,其结构如下:
  creator:{
  $ref:  //指向collection;                        =》namespace  //在node.js中获得DBRef时,所对应的属性。
  $db:  //指向db;                                =》db
  $id: //指向collection.document._id; =》 oid
  }
  mongodb does not support joins。
  介绍下mongoose population:
  连接两个文档,并通过父文档find子文档的属性:
  

var parentSchema=new Schema({  name:String,
  children:{type:Schema.Types.ObjectId, ref:'children'}
  })   
  
var childSchema=new Schema({
  name:String
  
})
  

  
// 在父schema中定义children,指向子document的_id,使用ref指向该collection。
  
//下面是创建这两个document,分别在parent和children这两个collection中。
  

  
var parentModel=mongoose.model('parent',parentSchema);
  
var childrenModel=mongoose.model('children',childSchema);
  

  
var childOne=new ChildrenModel({ name : ' B' });
  
childOne.save(val=>{
  (new parentModel({
  name:' A',
  children:childOne._id
  })) .save();
  
})
  

  
//这样就将两个document分别写入其各自的collection 中了。
  
//下面是使用他们;
  

  
parentModel.findOne({name:'A'}).populate('children')  //populate 中的值为parentSchema的children属性.
  
.exec((err,doc)=>{
  console.log(doc.children.name);   //show 'B'
  
})
  

  

  update
  

parentModel.findOne({name:'A'}).populate('children')  
.exec((err,doc)=>{
  doc.children= ...;              //重新指定一个document。可以是document._id。也可以直接传递document
  doc.save(callback);            
  
})
  

  

  很遗憾的是不能通过doc.children.name='';doc.save();这种方式来更改children document内的属性。
  动态连接:
  

var parentSchem=new Schema({  name:String,
  children:[ {
  kind:String,
  item:{type:ObjectId ,     refPath: 'children.kind '} } ]
  
})   
  

  
//refPath指向children.kind。通过kind的值,来定义类似之前ref的值;
  
//使用:
  

  
parentMode.findOne({name:'A'}).populate('children.item').exec()
  

  

  ref的值是不能直接更改的。所以通过更改kind的值,可以更改连接的子文档。

运维网声明 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-424557-1-1.html 上篇帖子: Ubuntu16.04上安装mongoDB 下篇帖子: MongoDB 3.4版本, C# 驱动 2.4 操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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