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

[经验分享] MongoDB笔记

[复制链接]

尚未签到

发表于 2015-7-7 06:17:15 | 显示全部楼层 |阅读模式


  • 安装配置
  Windows安装:
  Mongo数据模型  

  01
  一个Mongo系统(参考上述部署)包含一组数据库
  02
  一个 database 包含一组collection
  

  03
  一个 collection 包含一组document
  04
  一个 document 是一组field
  

  05
  一个 field 是一对key-value
  06
  一个 key 是一个名字(字符串)
  

  07
  一个 value 可以是一个
  08
  基本类型,如字符串,整数,浮点数,时间戳,二进制等等
  

  09
  document
  10
  value的数组
  
  1、下载 MongoDB
  MongoDB官网下载地址:http://www.mongodb.org/downloads 我下载的是Nightly(latest & stable)
  2、在C盘新建目录mongoDB,并把刚才下的Zip包中的bin解压到新建的mongoDB 中。

  1
  mkdir c:\mongodb
  2
  mkdir c:\mongodb\bin
  bin下的文件列表如下

  01
  c:\mongoDB\bin 的目录
  02
    
  

  03
  2011/09/06  14:26              .
  04
  2011/09/06  14:26              ..
  

  05
  2011/08/31  02:06         4,692,480 bsondump.exe
  06
  2011/08/31  02:09         2,347,008 mongo.exe
  

  07
  2011/08/31  02:14         5,054,464 mongod.exe
  08
  2011/08/31  02:17         4,709,888 mongodump.exe
  

  09
  2011/08/31  02:19         4,696,576 mongoexport.exe
  10
  2011/08/31  02:22         4,714,496 mongofiles.exe
  

  11
  2011/08/31  02:24         4,734,464 mongoimport.exe
  12
  2011/08/31  02:27         4,705,792 mongorestore.exe
  

  13
  2011/08/31  02:29         3,448,832 mongos.exe
  14
  2011/08/31  02:31         4,774,400 mongostat.exe
  3、在c:\mongodb下新建文件夹data

  1
  mkdir c:\mongodb\data
  4、启动mongodb

  01
  c:\mongoDB\bin>mongod -dbpath c:\mongodb\data
  02
  Tue Sep 06 16:02:06 [initandlisten] MongoDB starting : pid=452 port=27017 dbpath
  

  03
  =c:\mongodb\data 64-bit
  04
  Tue Sep 06 16:02:06 [initandlisten] db version v1.8.4-pre-, pdfile version 4.5
  

  05
  Tue Sep 06 16:02:06 [initandlisten] git version: f3bd113e0df642703fda8cc9fe7f6cd
  06
  f6503e5e8
  

  07
  Tue Sep 06 16:02:06 [initandlisten] build sys info: windows (6, 1, 7601, 2, 'Ser
  08
  vice Pack 1') BOOST_LIB_VERSION=1_42
  

  09
  Tue Sep 06 16:02:06 [initandlisten] waiting for connections on port 27017
  10
  Tue Sep 06 16:02:06 [websvr] web admin interface listening on port 28017
   嗯 MongoDB已经起了。
  
  Linux安装:
  先去MongoDB的官方下载http://www.mongodb.org/downloads,我这里下的是LINUX 32-BIT 1.8.2的版本。
  下完文件名为mongodb-linux-i686-1.8.2.tgz
  解压 tar xzvf mongodb-linux-i686-1.8.2.tgz
  得到文件夹mongodb-linux-i686-1.8.2,把这个文件移动到$HOME目录下,然后设置PATH
  不知道HOME目录是什么就在Terminal里 echo $HOME你就知道了
  在$HOME目录下建个.bashrc文件,写入如下配置
  export MONGODB_HOME=/home/castiel/mongodb-linux-i686-1.8.2
export PATH=$MONGODB_HOME/bin:$PATH
  好了,现在再建个目录作为保存我们数据库的地方
  我还是建在$HOME目录下,名字叫mongodatabase
  现在我们启动Mongodb的服务,在Terminal里输入
  mongod -dbpath /home/castiel/mongodatabse
  后面的参数指定了我们刚新建的文件夹作为存放数据库的地方
  现在服务应该跑起来了,再开个Terminal,输入mongo,就进入mongodb的shell交互界面
  如果到此一切成功,那么基础环境就算是搞定了。
  


  • 使用介绍
  
  Mongodb中有document,collection,database
  关系为database里有多个collection,每个collection里有多个document
  document就是以key-value的形式存放的,value也可以是document
  在shell里,db代表当前所使用的数据库,

  1
  show dbs #显示所有数据库
  2
  db.version() #显示Mongodb的版本号
  以下"collection"代表任意collection
  db.collection.update #mongodb的update是atomic,假如有两个人同时update同一个数据,两个都会生效,数据的状态是最后update的状态(last update win)
  db.collection.remove #不加参数则全部删除,但保留index

  1
  x = db.collection.findOne()
  2
  x.num = 42
  

  3
  db.collection.save(x) #shell中一种比用update来更新的更好办法
  db.drop_collection("name_of_collection") #彻底删除
  db.collection.insert() #插入document
  update里用的modifier
  $set #用来设置一个document,如不存在则创建该document

  1
  {"$set" : {"author.name" : "joe schmoe"}}
  $unset #用来删除一个document
  
  $inc #用来增加一个document的value部分,value必需是数字。如不存在则创建该document

  1
  {"$inc" : {"score" : 10000}}
  $push #用来向一个document的value部分,以数组的方式

  1
  {$push : {"comments" :{"name" : "joe", "email" : "joe@example.com", "content" : "nice post."}}
  $ne #与$push配合使用,不存在存会添加,存在就不会添加

  1
  {"authors cited" : {"$ne" : "Richie"}}, {$push : {"authors cited" : "Richie"}}
  $addToSet #同上,但是是单独使用的.有的时候你不确定某个document到底存不存在,用这个就不会造成数据的重复

  1
  {"$addToSet" : {"emails" : "joe@hotmail.com"}}
  $each #与$addToSet配合使用,添加数组

  1
  {"$addToSet" :{"emails" : {"$each" : ["joe@php.net","joe@example.com","joe@python.org"]}}
  $pop #像栈一样删除,随便从哪头开始

  1
  {$pop : {key : 1}}
  2
  {$pop : {key : -1}}
  $pull #根据所给的KEY删除指定的document,假如有多个KEY匹配,则删除多个document

  1
  {"$pull" : {"todo" : "laundry"}}
  假如有下面这样的一个docment

  01
  {
  02
  "_id" : ObjectId("4b329a216cc613d5ee930192"),
  

  03
  "content" : "...",
  04
  "comments" : [
  

  05
    {
  06
      "comment" : "good post",
  

  07
      "author" : "John",
  08
      "votes" : 0
  

  09
    },
  10
    {
  

  11
      "comment" : "i thought it was too short",
  12
      "author" : "Claire",
  

  13
      "votes" : 3
  14
    },
  

  15
    {
  16
      "comment" : "free watches",
  

  17
      "author" : "Alice",
  18
      "votes" : -1
  

  19
    }]
  20
  }
  我们现在想要更新第一个名为good post的comments的votes,可以这样做

  1
  db.blog.update({"post" : post_id}, {"$inc" : {"comments.0.votes" : 1}}) #看见没,可以像操作数组一样,多方便啊
  现在我们来把这个comment的author由John改成Jim,但如果这个时候我不知道John是在数组里的第几个,即我不知道index,这个时候可以用$,即原来用index的地主改成$,就像下面这样

  1
  db.blog.update({"comments.author" : "John"},{"$set" : {"comments.$.author" : "Jim"}})
  update还有另一种形式,就是其第三个参数设置为true,使之成为一个upsert

  1
  db.analytics.update({"url" : "/blog"}, {"$inc" : {"visits" : 1}}, true)
  上面的update包含了两个意思,以{url : "/blog"}进行查询,成功找到就更新,没有找到就创建
  这样我们就不用自己写代码来判断存在或是不存在的情况了
  update默认情况下只会更新第一个匹配的到的数据,如果要更新所有都匹配的数据,只要把它的第四个参数也设置为true就行
  
  用findAndModify可以解决多线程争用问题,不知道这词用的对不对,反正自己明白就好了
  用在update上

  1
  ps = db.runCommand({"findAndModify" : "processes",
  2
                                "query" : {"status" : "READY"},
  

  3
                                "sort" : {"priority" : -1},
  4
                                "update" : {"$set" : {"status" : "RUNNING"}}).value
  

  5
  do_something(ps)
  6
  db.process.update({"_id" : ps._id}, {"$set" : {"status" : "DONE"}})
  可以用在remove上

  1
  ps = db.runCommand({"findAndModify" : "processes",
  2
                               "query" : {"status" : "READY"},
  

  3
                               "sort" : {"priority" : -1},
  4
                               "remove" : true).value
  

  5
   do_something(ps)
  对于,这三种操作:insert,remove,update,这三种速度都很快,因为他们都是fire-and-forget类型的操作,即不用等待服务器作出response,就马上可以进行下一步操作。
  那也许你就会问,我都不能确定服务器收到了我的数据,那怎么办,其实是有办法的,现在我还没有看到而已。

  1
  db.users.find({}, {"username" : 1, "email" : 1})
  上面代码的意思是找到USERS里所有的数据里的username和email这两种KEY所对应的数据。
  USERS里可能还有其它的key比如:gender,address什么的,但某些情况下我们只需要其中的一部分。
  每次用find或是findOne的时候,它总是会返回_id这个key-value,不想让它返回这个怎么办,这样做

  1
  db.users.find({}, {"username" : 1, "_id" : 0}) #这时候就只会返回username了,不会返回_id了
  "$lt", "$lte", "$gt", "$gte" 这四个分别代表 =,它们是用来设置查询范围的,比如

[table][tr][td]  1
[/td][td]  db.users.find({"age" : {"$gte" : 18, "$lte" : 30}}) #找出年龄在18

运维网声明 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-83845-1-1.html 上篇帖子: Mongodb之(初出茅庐) 下篇帖子: mongodb gdal 矢量数据格式驱动
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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