打开mongodb 时命令行启动 的一些参数
--dbpath 指定数据库文件保存位置
--fork 指定是否后台运行
--port 指定端口
--logpath 指定日志文件位置
--config 这里可以指定配制信息
--noprealloc 启动时不预先分配数据库空间
--nojournal 启动时不预先分配日志文件
关闭MongoDB
也可以使用kill <进程号> 或kill -2 <进程号>
当mongod接收到SIGTERM或SIGINT会稳妥退出
正常的关闭方法
use admin
db.shutdownServer()
增加用户
use admin //这个时什么意思
增加一个root用户,密码是abcd
db.addUser("root","abcd")
db.addUser("read_only","avce",true) 第三个参数true 表示是只读用户,只能查询数据,不能让改写数据。
权限配置配置auth 项目
要在mongod.conf 文件中把auth改为true。把这个注释去掉,这个就把权限体系打开了。
用合适的用户登录。
db.auth("user_name","password")
查看所有数据库
show dbs
删除用户
db.system.users.remove({"user":"test_user"}) 这样就把test_user 这个用户删除了。
其实就是system.users 这个表中删除一行,用户信息放在system.users这个表中的。
mongodb技术特点
面向文档的存储引擎,可以方便支持非结构化数据
全面的索引支持,可以在任意属性上建立索引
数据库本身内置的复制与高可用
数据库本身支持的自动分片集群
无列结构,随时加列,
区分大小写,
区分数值和字符串 3 和"3"不同,
key不能重复,
文档中可以嵌入文档
常用增删改查功能
一,增
1,定义一个变量
post={"title":"My Blog Post","content":"Here is my blog post","date":new Date()}
在数据库中插入这个变量
db.blog.insert(post)
在数据库中查询这个变量
db.blog.find()
db.blog.findOne()
结果如下:
_id 是mongodb自动生成的,作用是标识一个唯一的文档.
修改
定个一个变量,并为这个变量增加一个属性,值为空数组
post.comments=[]
把这个变量增加到原存在数据中
db.blog.update({title:"My Blog Post"},post)
db.blog.find()
db.blog.findOne()
删除
db.blog.remove({title:"My Blog Post"})
db.blog.find()
db.blog.findOne()
如果要清空集合,而且集合内包含了过多的记录时,不妨考虑使用db.drop_collecton("foo")命令直接删除集合,然后使用db.foo.ensureIndex()命令重建索引.这个会更快,(相当于在sql中,直接drop 掉一张表,而不是删除表中的所有数据.
可以发现db.blog.find()不返回数据, db.blog.findOne()返回一个null,
在shell中查看帮助信息
help
也可以查看具体的帮助信息,如db.help
shell中输入函数名,不加(),就是把函数名的源代码列出来
如:
测试代码 from pymongo import Connection import time db = Connection().performance_test db.drop_collection("updates") collection = db.updates collection.insert({"x": 1}) # make sure the insert is complete before we start timing collection.find_one() start = time.time() for i in range(100000): collection.update({}, {"$inc" : {"x" : 1}}) # make sure the updates are complete before we stop timing collection.find_one() print (time.time() - start ) |
mongodb 所支撑的数据类型
- 空值型
- bool型
- 64位浮点型(在shell中不支撑整数,输入整数也会当作64位浮点数处理,自动转换)
- 字符串
- 对象id
- 日期
- 正则表达式
- 代码
- 数组
- 内嵌文档
- 未定义类型
不在shell中还支撑的其他类型
- 32/64位整数
- 符号
- 二进制数据
- 最大值和最小值(由使用的计算机环境所控制)
特别强调
_id 用于唯一标示文档,如果插入一个文档的_id已存在于数据库中,如果用insert 插入则会产生异常,如果用save()进行保存,则不会产生异常,但是会覆盖原来的数据.
ObjectId 由12字节(也就是24个16进制数字)组成.第0-3字节为时间戳,第4-6字节为机器标识(一般是主机名的散列值)第7-8是pid,9-11是计数器. 一般情况下不会指定id,由mongodb自动生成.
批量插入
x=[{"w":1},{"er":22}];
db.blog.insert(x);
db.blog.find();
db.blog.findOne();
updata 操作
文档替换
原文档
{
"_id" : ObjectId("4b2b9f67a1f631733d917a7a"),
"name" : "joe",
"friends" : 32,
"enemies" : 2
}
期望结果
{
"_id" : ObjectId("4b2b9f67a1f631733d917a7a"),
"username" : "joe", "relationships" :
{
"friends" : 32,
"enemies" : 2
}
}
操作:首先查找记录
var joe = db.users.findOne({"name" : "joe"});
修改记录属性,很普通的JavaScript语法
joe.relationships = {"friends" : joe.friends, "enemies" : joe.enemies};
joe.username = joe.name;
delete joe.friends;
delete joe.enemies;
delete joe.name;
更新
db.users.update({ "name" : "joe" }, joe);
二,upsert模式,
如果找到匹配记录,刚更新之,如果没有找到记录,则插入之(第三个参数设为true)
db.users.update({ "name" : "joe" }, joe,true);
三,multi模式
如果匹配到的结果是多行,则在默认情况下只会更新第一个匹配的文档,开启multi模式,才会全部更新(第四个参数设为true)
db.users.update({ "name" : "joe" }, joe,true, true);
db.math.updat({"count":25},{"$inc":3},true)
意思是如要存在{"count":25}这个键盘,就把原数据加3,如果不存在,就设为25
修改器
原数据
db.hits.insert({"url":"www.datagru.cn","pv":102});
db.hits.insert({"url":"f.datagru.cn","pv":108});
db.hits.insert({"url":"www.itpub.net","pv":155});
$inc
把对应的文档增加或减少:这里是pv的值加1
db.hits.update({"url":"www.itpub.net"},{"$inc":{"pv":1}});
$set:增加键值 ,修改键值
直接设定键值,如果原来有 ip 这个键,就把原有的这个键的值设为20,如果没有就增加一个键,并把值设为20.
db.hits.update({"_id" : ObjectId("5161a3056b432e29748b2164")},{"$set":{"ip":20}});
$unset:删除键值
把Ip这个键值删除,后面这个1是随便写的
db.hits.update({"url":"www.datagru.cn"},{"$unset":{"ip":1}});
数组修改器
db.hits.update({"_id" : ObjectId("5a692036e5f1cf06d9c4ec4e")},{"$set":{"users":[{"name":"Zhang","age":23},{"name":"Huang","age":21}]}});
$push:为数组追加元素
db.hits.update({"_id" :
ObjectId("5a692036e5f1cf06d9c4ec4e")},{"$push":{"users":{"name":"He","age":34}}});
定位修改 ,
这种方法用的很少,因为很不方便
db.hits.update({"_id" :
ObjectId("5161a3056b432e29748b2164")},{"$set":{"users.2.name":"Liu"}});
这里2 表只数组下标为2的元素
db.hits.update({"_id" :
ObjectId("5161a3056b432e29748b2164")},{"$set":{"users.0.name":"Xie"}});
这里0 表只数组下标为0的元素
定位操作符$
db.hits.update({"users.name":"Xie"},{"$set":{"users.$.name":"Gong"}});
这里的$就是定位操作符,这样就不用人工直接输入位置了。
getLastError
返回最后一次运行函数或语句的信息,这里不一定非得是error,也可能是正确的信息
用法:
db.runCommand ({getLastError:1}) 这里的1可以理解成true
findandmodify
使用mongodb 具有原子性的操作。还没有深入学习
瞬时完成与安全操作
n 瞬时完成:客户端将文档发给服务器,无须等待服务器有任何响应(实际上也没有)
,即可进行下一操作。(类似于网络协议中的UDP,称为"离弦之箭")
n 安全操作:客户端将文档发给服务器,再执行getLastError操作,等待服务器反馈后再继续下一操作,如果发现服务器反馈与预期不符,则抛出异常
Mongodb查询:find
插入测试数据
db.abc.insert([
{"a":23,"b":21,"c":34},
{"a":23,"b":32},
{"a":23,"b":24,"c":54},
{"a":23,"c":37},
{"a":31,"b":21,"c":55},
{"a":31,"b":25,},
{"a":31,"c":34}])
db.abc.find({"a":23},{"b":0}) 表示我们不要b列,其他的都要
db.abc.find({"a":23},{"b":1,"c":1})表示只要b,c两列
db.abc.find({"a":23},{"b":1},{"-id":0})表示不要_id这一列
db.abc.find({"a":23},{"b":1},{"c":0})这种写法是不对的,要报错,只有_id 可以这样写
比较查询
逻辑操作符
db.abc.find({"b":{"$in":[25,32]}})
db.abc.find({"b":{"$mod":[5,1]}})) b除以5余1的话就符合要求 db.abc.find({"b":{"$not":{"$mod":[5,1]}}})
正则表达式
n MongoDB的正则表达式实现了SQL中的通配符匹配的机制,而且比SQL更加强大。但只有类似于/^.+/这样的前缀型正则表达式才能够使用索引,其他形式都会做全集合扫描。
n MongoDB采用Perl兼容的正则式语法PCRE。
加/i表示忽略大小写
数组查询
db.food.insert ("fruit":["apple","banana","peach"]})
db.food.find({"food":"banana"}) 也能找出结果,但是下面
$all
加上$all 之后就只能把整个数据匹配完了才返回结果
$size
表示数据大小
db.food.find({"food":{"$size":3}})
表示在数据大小等于3的元素
$slice
和sql中limit相似,约定返回数据的个数
第一个是返回前10个,第二个是返回后10,第3个是说从23个起返回10个。
查询内嵌文档
$ where
用$ where 后面加上javascrip函数。
测试代码
from pymongo import Connection
import time
db = Connection().performance_test
db.drop_collection("updates")
collection = db.updates
collection.insert({"x": 1})
# make sure the insert is complete before we start timing
collection.find_one()
start = time.time()
for i in range(100000):
collection.update({}, {"$inc" : {"x" : 1}})
# make sure the updates are complete before we stop timing
collection.find_one()
print time.time() - start