mongodb基础知识

一、mongodb开启和关闭

1、打开mongodb 命令行启动的一些参数

--dbpath 指定数据库文件保存位置

--fork 指定是否后台运行

--port 指定端口

--logpath 指定日志文件位置

--config 这里可以指定配制信息

--noprealloc 启动时不预先分配数据库空间

--nojournal 启动时不预先分配日志文件

2、关闭MongoDB

也可以使用kill <进程号> 或kill -2 <进程号>

当mongod接收到SIGTERM或SIGINT会稳妥退出

正常的关闭方法

use admin

db.shutdownServer()

   

3、查看所有数据库

show dbs

   

4、技术特点

        面向文档的存储引擎,可以方便支持非结构化数据

        全面的索引支持,可以在任意属性上建立索引

        数据库本身内置的复制与高可用

        数据库本身支持的自动分片集群

        无列结构,随时加列,

        区分大小写,

        区分数值和字符串 3 和"3"不同,

        key不能重复,

        文档中可以嵌入文档

   

   

   

二、用户管理

1、增加用户

use admin //这个时什么意思

增加一个root用户,密码是abcd

db.addUser("root","abcd")

db.addUser("read_only","avce",true) 第三个参数true 表示是只读用户,只能查询数据 ,不能让改写数据。

   

2、权限配置 配置auth 项目

   

要在mongod.conf 文件中把auth改为true。把这个注释去掉,这个就把权限体系打开了。

3、用合适的用户登录。

db.auth("user_name","password")

   

4、删除用户

db.system.users.remove({"user":"test_user"}) 这样就把test_user 这个用户删除了。

其实就是system.users 这个表中删除一行,用户信息放在system.users这个表中的。

   

三、常用的增删改查

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自动生成的,作用是标识一个唯一的文档.

   

1.mongodb shell中的数据类型

  • 空值型
  • bool型
  • 64位浮点型(在shell中不支撑整数,输入整数也会当作64位浮点数处理,自动转换)
  • 字符串
  • 对象id
  • 日期

    注意在创建日期时一定要用new Date()这种方式,这种方式才能创建真正日期格式的日期,直接用Date(),创建的是日期格式的字条串,要注意。

  • 正则表达式
  • 代码
  • 数组
  • 内嵌文档
  • 未定义类型

2.不在shell中还支撑的其他类型

  • 32/64位整数
  • 符号
  • 二进制数据
  • 最大值和最小值(由使用的计算机环境所控制)

       

3.特别强调

_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();

   

   

   

   

2、改

定个一个变量,并为这个变量增加一个属性,值为空数组

post.comments=[]

把这个变量增加到原存在数据中

db.blog.update({title:"My Blog Post"},post)

db.blog.find()

db.blog.findOne()

   

1.updata 操作

   

1.文档替换

原文档

{

"_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);

2.upsert模式

如果找到匹配记录,刚更新之,如果没有找到记录,则插入之(第三个参数设为true

db.users.update({ "name" : "joe" }, joe,true);

3,multi模式

如果匹配到的结果是多行,则在默认情况下只会更新第一个匹配的文档,开启multi模式,才会全部更新(第四个参数设为true)

db.users.update({ "name" : "joe" }, joe,true, true);

db.math.updat({"count":25},{"$inc":3},true)

意思是如要存在{"count":25}这个键盘,就把原数据加3,如果不存在,就设为25

4.修改器

   

原数据

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"}});

这里的$就是定位操作符,这样就不用人工直接输入位置了。

   

5.getLastError

返回最后一次运行函数或语句的信息,这里不一定非得是error,也可能是正确的信息

用法:

db.runCommand ({getLastError:1}) 这里的1可以理解成true

   

findandmodify

使用mongodb 具有原子性的操作。还没有深入学习

   

6,瞬时完成与安全操作

      瞬时完成:客户端将文档发给服务器,无须等待服务器有任何响应(实际上也没有),即可进行下一操作。(类似于网络协议中的UDP,称为"离弦之箭")

       安全操作:客户端将文档发给服务器,再执行getLastError操作,等待服务器反馈后再继续下一操作,如果发现服务器反馈与预期不符,则抛出异常

3、删除

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,

   

4、查

1.在shell中查看帮助信息

help

   

也可以查看具体的帮助信息,如db.help

shell中输入函数名,不加(),就是把函数名的源代码列出来

如:

   

   

2.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 可以这样写

   

3.比较查询

   

   

4.逻辑操作符

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]}}})

   

5.正则表达式

n        MongoDB的正则表达式实现了SQL中的通配符匹配的机制,而且比SQL更加强大。但只有类似于/^.+/这样的前缀型正则表达式才能够使用索引,其他形式都会做全集合扫描。

n        MongoDB采用Perl兼容的正则式语法PCRE

/i表示忽略大小写

   

6.数组查询

   

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个。

   

   

7.查询内嵌文档

   

8.$ 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

   

原文地址:https://www.cnblogs.com/liuqianli/p/8359267.html