MongoDB基本使用

来源:互联网 发布:哪款网络电视机好 编辑:程序博客网 时间:2024/05/18 22:45

MongoDB自带JavaScript shell

MongoDB shell

  • 命令db查看当前指向哪个数据库
  • 创建 db.col.insert(post)
  • 读取db.col.find()
    db.col.findOne()
  • 更新post.comments=[] db.col.update({title:”My Blog Post”},post)
    update函数有两个参数至少,第一个参数用于匹配待更新的文档,第二个参数是新的文档。
  • 删除 db.col.remove({title:"My Blog Post"})
    db.col.remove() //删除集合中的所有文档
    db.col.drop() //删除集合
数据类型

JSON只有null,布尔,数字,字符串,数组和对象这几种数据类型。
MongoDB数据类型:
- null
- 布尔
- 数值 默认64位浮点数型数值;NumberInt(“3”)表示4字节带符号整数;NumberLong(“3”)表示8字节带符号整数;
- 字符串 支持UTF-8字符串
- 日期; 不区分时区。自新纪元以来的毫秒数;要用new Date()而非Date()后者返回的日期的字符串而非日期的对象;
- 正则表达式
- 数组
- 数组可以包含不同类型的元素

- 数组中甚至可以嵌套数组- MongoDB能够理解数组的结构,并深入其内部对其内容进行操作;
  • 内嵌文档
  • 对象ID ;12字节的id,是文档的唯一标识。ObjectId()

    • 每个集合里的文档的ID是唯一的,不同集合文档ID可以重复

    • 前4个字节是时间戳,从标准纪元开始,单位为秒;

    • 4-6字节是机器主机名的散列值(hash);

    • 7-8字节是产生ObjectId的进程的进程标识符(PID),用于区分同一机器上的多线程;

    • 9-11字节是一个自动增加的计数器,保证同一同一秒产生的ObjectId也是不同的;一秒钟同时允许2563个ObjectId.

  • 二进制数据;非UTF-8字符串要以这种形式保存

  • 代码;查询和文档中可以插入任意JavaScript代码;

使用

  • 连接到指定机器上的数据库:mongo 机器名:端口/数据库名
  • 启动shell不连接任何数据库:mongo -nodb
  • 再连接到指定数据库:
conn = new Mongo("some-host:30000")db = conn.getDB("myDB")
  • > help获取帮助
  • 只输入函数名可以查看函数的实现代码
  • mongo script1.js script2.js script3.js
  • mongo --quiet server-1:30000/foo scirpt1.js script2.js
    指定主机,数据库,执行脚本
  • shell辅助函数不能在文件中使用,如show dbs对应db.getMongo().getDbs() show collections对应db.getCollectionNames() use foo对应db.getSisterDB("foo")
  • load("defineConnectionTo.js")加载执行
  • > run("ls","-l","/usr/local")用来执行命令行程序
  • 集合命名如果包含保留字的话 db.getCollection("version")
  • > Object.bsonsize(doc) 查看文档大小;要求文档大小必须小于16MB
  • 文档替换
> var jone = db.col.findOne({name:"jone"})> jone.releationships = {friends:jone.friends,enemies:jone.enemies}{ "friends" : 32, "enemies" : 2 }> jone.usename=jone.namejone> delete jone.friendstrue> delete jone.enemiestrue> delete jone.nametrue> db.col.update({name:"jone"},jone)WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.col.find(){ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone" }> 
  • 原子性的更新修改器,对指定文档的某些字段进行更新
//$inc修改器用来增加一个键的值,如果不存在就创建这个键> db.col.update({usename:"jone"},{"$inc":{friends:1}})WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.col.find(){ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone", "friends" : 1 }> db.col.update({usename:jone},{"$set":{friends:2}})WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })> db.col.find(){ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone", "friends" : 1 }> db.col.update({usename:"jone"},{"$set":{friends:2}})WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.col.find(){ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone", "friends" : 2 }//unst将这个键删除> db.col.update({usename:"jone"},{"$unset":{friends:1}})WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.col.find(){ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone" }
  • “$push”向数组末尾加一个元素,如果数组不存在,则创建一个新的数组
> db.col.find(){ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone" }> db.col.update({usename:"jone"},{"$push":{comments:{name:"joe",email:"joe@example.com",content:"nice"}}})WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.col.find(){ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone", "comments" : [ { "name" : "joe", "email" : "joe@example.com", "content" : "nice" } ] }> db.col.update({usename:"jone"},{"$push":{comments:{name:"bob",email:"bob@example.com",content:"good"}}})WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })> db.col.find(){ "_id" : ObjectId("5811c15b36c14a6dd31ec9f5"), "releationships" : { "friends" : 32, "enemies" : 2 }, "usename" : "jone", "comments" : [ { "name" : "joe", "email" : "joe@example.com", "content" : "nice" }, { "name" : "bob", "email" : "bob@example.com", "content" : "good" } ] }
  • eachpush”结合可以一次插入多个元素
  • “$slice”限制数组的长度
  • “$sort”排序
  • “$ne”条件检验,比如在向某个数组中插入数据时,如果不存在某个内容就插入
  • “$addToSet”也是验重
  • {"$pop":{"key":1}}从数组末尾删除一个元素
    {"$pop":{"key":-1}}从数组头部删除一个元素
    {"$pull":{tem:"flower"}}删除数组中的所有”flower”
    可通过下标访问数组comments.0数组的第一项
  • 定位符”$” db.col.update({"commments.author:"Jone"},{"$set":{"comments.$.authors:"Jim"}})
  • $inc因为就地修改,不改变文档结构,所以比较快;数组修改器可能要改变文档大小,会慢一些;
  • 填充因子(paddingFactor)是MongoDB为每个新文档预留的增长空间。让一个文档增大,填充因子会变大,如果后面的更新导致了更多次的文档移动,填充因子会持续增大;如果不再有文档移动,填充因子会慢慢降低到1.
  • upsert更新是在找到符合更新条件的对象时,进行更新;找不到时就按update设定的条件新建一个文档;
  • $setOnInsert创建文档的时候创建字段并赋值,以后所有的更新操作时,这个值不再改变;
  • update函数的第四个参数为true表示当有多个符合条件的文档时,全部更新;
  • getLastError命令可以返回最后一次操作的相关信息;键n的值表示被更新的文档的数量 db.runCommand({getLastError:1})
  • findAndModify返回符合更新条件的文档更新前的值;
ps = db.runCommand({"findAndModify": "processes",    query:{status:"READY"},    sort:{priority:-1},    update:{"$set":{stats:"RUNNING"}}}).value
  • 写入安全(write concern)是一种客户端设置,用于控制写入的安全机制;分为两种:应答式写入(数据库会给出响应,告诉你是否写入成功)和非应答式写入(不知道是否写入成功)。默认是应答式;
  • shell对非应答式的支持与客户端有区别:shell执行非应答式时会检查最后一个操作是否成功;即便前面一系列的无效操作,最后一个操作是有效的,就不会报错;
  • 2012年之前,默认的写入安全方式是非应答的;如何区分:新的都用的MongoClient类;旧的连接对象用的Mondo或者Connection或其他;
0 0
原创粉丝点击