• 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

       

  • 相关阅读:
    网络初级篇之STP(BPDU详解与STP故障恢复)
    网络初级篇之STP(实验验证)
    3-1 查看帮助,命令历史与快捷键
    2-1 bash基本特性
    2-0 虚拟机与Linux系统安装
    0.操作系统的获取与安装
    1.计算机基础
    Linux下打包、压缩和解压
    JAVA基本数据类型转换的注意事项
    EditPlus代码自动完成的设置
  • 原文地址:https://www.cnblogs.com/liuqianli/p/8359267.html
Copyright © 2020-2023  润新知