MongoDB快速入门

来源:互联网 发布:java 字符串拼接 效率 编辑:程序博客网 时间:2024/06/02 02:32

MongoDB快速入门

运行mongodb

运行并设置数据目录

mongod.exe --dbpath d:\data\db

作为服务运行

mongod.exe --bind_ip yourIPadress --logpath "C:\data\dbConf\mongodb.log" --logappend --dbpath "C:\data\db" --port yourPortNumber --serviceName    "YourServiceName" --serviceDisplayName "YourServiceName" --install    
  • –bind_ip 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
  • –logpath 定MongoDB日志文件,注意是指定文件不是目录
  • –logappend 使用追加的方式写日志
  • –dbpath 指定数据库路径
  • –port 指定服务端口号,默认端口27017
  • –serviceName 指定服务名称
  • –serviceDisplayName 指定服务名称,有多个mongodb服务时执行。
  • –install 指定作为一个Windows服务安装。

进入shell

mongo

MongoDB概念解析

SQL术语/概念 MongoDB术语/概念 解释说明 database database 数据库 table collection 数据库表/集合 row document 数据记录行/文档 column field 数据字段/域 index index 索引 table joins 表连接,MongoDB不支持 primary key primary key 主键,MongoDB自动将_id设置为主键

MongoDB常用操作

连接到数据库

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

创建数据库

use test-- 查看数据库show dbs-- 插入数据db.mydb.insert({"name":"ck"})-- 创建表db.createCollection("log");-- 删除表db.mydb.drop();-- 查看表show tables;

删除数据库

-- 删除当前数据库db.dropDatabase()

插入记录(插入文档)

document的结构和json一样,所有存储在集合(collection)中的数据都时BSON(Binary JSON)。

db.COLLECTION_NAME.insert(doucument)

插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。

更新文档

db.collection.update(   <query>,   <update>,   {     upsert: <boolean>,     multi: <boolean>,     writeConcern: <document>   })-- 实例db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如,inc…)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。

删除文档

db.collection.remove(   <query>,   <justOne>)-- VERSION >= 2.6db.collection.remove(   <query>,   {     justOne: <boolean>,     writeConcern: <document>   })

查询文档

db.COLLECTION_NAME.find()-- 美化输出db.COLLECTION_NAME.find().pretty() 

和RDBMS查询Where比较:

操作 格式 范例 RDBMS中类似语句 等于 {key:value} db.col.find({“by”:”age”}).pretty() where by = “age” 小于 {key:{lt:value}}|db.col.find({"likes":{lt:50}}).pretty() where likes<50 小于或等于 {key:{lte:value}}|db.col.find("likes":{lte:50}).pretty() where likes<=50

类似的有大于(gt),(gte),不等于($ne)。

  • AND语法
db.col.find({key1:value1, key2:value2}).pretty()
  • OR语法
db.col.find(   {      $or: [         {key1: value1}, {key2:value2}      ]   }).pretty()
  • 根据字段类型匹配
    使用$type关键字,对应的字段类型列表如下:
类型 数字 备注 Double 1 String 2 Object 3 Array 4 Binary data 5 Undefined 6 已废弃 Object id 7 Boolean 8 Date 9 Null 10 Regular Expression 11 JavaScript 13 Symbol 14 JavaScript (with scope) 15 32-bit integer 16 Timestamp 17 64-bit integer 18 Min key 255 Query with -1. Max key 127
  • Skip 和 Limit方法
db.COLLECTION_NAME.find().limit(NUMBER)db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
  • Sort排序
    sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1
    为升序排列,而-1是用于降序排列
db.COLLECTION_NAME.find().sort({KEY:1})

建立索引

-- 创建索引db.COLLECTION_NAME.ensureIndex({KEY:1})-- 查询索引db.COLLECTION_NAME.getIndexes();

语法中 Key值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。

  • background:Boolean建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false。
  • unique:Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
  • name:string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
  • dropDups:Boolean 在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.
  • sparse: Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false
  • expireAfterSeconds:integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
  • v:index version 索引的版本号。默认的索引版本取决于mongod创建索引时
    运行的版本。
  • weights:document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
  • default_language:string对于文本索引,该参数决定了停用词及词干和词器的规则的
    列表。默认为英语
  • language_override:string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

聚合(待补充)

MongoDB复制(副本集)

副本集设置
mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"-- 示例 将27018端口的副本加入到27017的副本集mongod --port 27017 --dbpath "D:/data/rs1" --replSet rs0mongod --port 27018 --dbpath "D:/data/rs2" --replSet rs0 mongo localhost:27017-- 查询是否主节点`>`rs.isMaster() `>`rs.add("127.0.0.1:27018") 

只能通过主节点执行add操作添加副本集,被添加的副本集名称要与主节点副本一致;主机宕机后,副本会接管成为主节点。

MongoDB 分片(待补充)

备份与恢复

mongodump -h dbhost -d dbname -o dbdirectorymongorestore -h dbhost -d dbname --directoryperdb dbdirectory

监控

mongostat 和mongotop

MongoDB 原子操作

mongodb不支持事务,所以,在你的项目中应用时,要注意这点。无论什么设计,都不要要求mongodb保证数据的完整性。

但是mongodb提供了许多原子操作,比如文档的保存,修改,删除等,都是原子操作。
所谓原子操作就是要么这个文档保存到Mongodb,要么没有保存到Mongodb,不会出现查询到的文档没有保存完整的情况。

原子操作命令

命令 语法 描述 set|{set:{field:value}} 更新键值,不存在则创建 unset|{unset:{field:1}} 删除键 inc|{inc:{field:value}} 为数字型键进行增减操作 push|{push:{field:value}} 追加到field,field必须为数组,不存在则创建 pushAll|{pushAll:{field:value_array}} 同上 pull|{pull:{field:value}} 从数组field删除等于value的值 addToSet|{addToSet:{field:value}} 添加到数组,值不存在才添加 pop|{pop:{field:1}} 删除数组第一个(-1)或者最后一个(1)元素 rename|{rename:{old_field_name:new_field_name}} 修改字段名 bit|{bit:{field:{and:5}}} 位操作,integer类型

MongoDB ObjectId

ObjectId 是一个12字节 BSON 类型数据,有以下格式:

  • 前4个字节表示时间戳
  • 接下来的3个字节是机器标识码
  • 紧接的两个字节由进程id组成(PID)
  • 最后三个字节是随机数。

MongoDB备份

非主节点都不具备写入能力。

主从复制模式

mongod启动默认dbpath是当前根目录下的mongodb/db目录,需要手动创建,若不存在启动可能会失败。可复制多分mongodb实例测试。

-- 启动主库monogd --dbpath="../db" -port=27017 --master-- 启动从库monogd --dbpath="../db" --port=8888 --slave --source=127.0.0.1:12707 -- 添加已启动的mongod 从库,假设端口5555,使用mongo链接mongo 127.0.0.1:5555use localdb.sources.insert({"host":"127.0.0.1:27017"})db.sources.find()

注册用复制启动成功后,从备库查询报错:not master and slaveOk=false。解决办法:从mongo客户端执行 db.getMongo().setSlaveOk()

副本集模式

与主从复制的区别:

  • 没有特定的主数据库
  • 如果主数据库宕机,集群中会推选一个从数据库作为主数据库顶上,具备自动恢复能力。
  • 集群中包含一个仲裁节点,集群中数据库数目最好为奇数(包含仲裁数据库),方便仲裁。

配置示例1(假设replSet的名称为myrep):

-- mongod实例1,端口2222mongod --port=2222 --dbpath="../db" --replSet myrep/127.0.0.1:3333-- mongod实例2,端口3333mongod --port=3333 --dbpath="../db" --replSet myrep/127.0.0.1:2222-- 初始化副本集,mongo 127.0.0.1:2222db.initiate({"_id":"myrep","members":[{"_id":1,"host":"127.0.0.1:2222"},{"_id":2,"host":"127.0.0.1:3333"}]});--添加仲裁节点mongo --port=4444 -dbpath="../db" --repSet myrep/127.0.0.1:2222-- 只能在primary节点上操作db.addArb("127.0.0.1:4444") 
原创粉丝点击