码迷,mamicode.com
首页 > 数据库 > 详细

mongodb基础知识

时间:2018-01-25 23:15:27      阅读:494      评论:0      收藏:0      [点我收藏+]

标签:报错   date()   nal   不能   root   tab   use   帮助信息   png   

打开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

mongodb基础知识

标签:报错   date()   nal   不能   root   tab   use   帮助信息   png   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!