zoukankan      html  css  js  c++  java
  • 浅尝MongoDB

    浅尝MongoDB


    安装mongoDB

    Linux

    以linux环境为例,安装mongodb,最简单的方式就是 利用自带的包管理器

    我的环境是 linux deepin 15.4 (基于debian 8)

    sudo apt install mongodb

    ~$ mongo -version 
    MongoDB shell version: 3.2.11
    

    当你看到这个说明你的mogodb已经安装完成。

    Windows


    windows很容易
    去官网下个包,无脑下一步即可。

    Docker

    docker部署很容易:参考 https://hub.docker.com/r/tutum/mongodb/ 这个镜像

    如果还不知道docker是什么,参考之前的帖子。或者百度自行安装体验。

    MongoDB数据库

    MongoDB数据简介

    它是一种 NoSQL (not only sql)非关系型数据库

    开源且跨平台

    服务器可以集群以平衡服务器的压力

    支持高并发的读写和海量存储

    数据存储没有模式

    MongoDB数据存储模式

    集合(相当于关系型数据里的表)

    文档(关系型数据库中的记录)

    文档就是一些键值对(类似python里的字典)

    同一集合中的文档结构模式与数据类型可以不同

    文档中的字符串是区分大小写的

    文档结构举例

    {'name':'jonny',age:22}

    {'name':'Green','age':32,'children':['john','lily']}

    键值对是有序的

    可以支持更多的嵌套

    不同的结构类型可以属于同一集合

    MongoDB也是 C/S架构 类似mysql数据库

    数据库环境建立

    mongod 是服务器端 默认启动了已经。 详细的可以

    mongod -h

    ~$ mongod
    2017-07-13T19:24:32.101+0000 I CONTROL  [initandlisten] MongoDB starting : pid=26124 port=27017 dbpath=/data/db 64-bit host=jonny-PC
    2017-07-13T19:24:32.101+0000 I CONTROL  [initandlisten] db version v3.2.11
    2017-07-13T19:24:32.101+0000 I CONTROL  [initandlisten] git version: 009580ad490190ba33d1c6253ebd8d91808923e4
    2017-07-13T19:24:32.101+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.2k  26 Jan 2017
    2017-07-13T19:24:32.101+0000 I CONTROL  [initandlisten] allocator: tcmalloc
    2017-07-13T19:24:32.101+0000 I CONTROL  [initandlisten] modules: none
    2017-07-13T19:24:32.101+0000 I CONTROL  [initandlisten] build environment:
    2017-07-13T19:24:32.101+0000 I CONTROL  [initandlisten]     distarch: x86_64
    2017-07-13T19:24:32.101+0000 I CONTROL  [initandlisten]     target_arch: x86_64
    2017-07-13T19:24:32.101+0000 I CONTROL  [initandlisten] options: {}
    2017-07-13T19:24:32.131+0000 E NETWORK  [initandlisten] listen(): bind() failed errno:98 Address already in use for socket: 0.0.0.0:27017
    2017-07-13T19:24:32.131+0000 E NETWORK  [initandlisten]   addr already in use
    2017-07-13T19:24:32.131+0000 E STORAGE  [initandlisten] Failed to set up sockets during startup.
    2017-07-13T19:24:32.131+0000 I CONTROL  [initandlisten] dbexit:  rc: 48
    

    基本客户端操作

    mongo 是客户端

    ~$ mongo
    MongoDB shell version: 3.2.11
    connecting to: test
    > 
    

    直接连上了本地的服务器。

    常用命令

    使用数据库和集合前不用建立,执行插入数据时会自动建立

    这一点和关系型数据库不同。用之前必须要先创建 数据库和表。否则不行,但是mongodb不一样,用之前不需要创建。

    usb db_name (切换数据库)

    比如我们要使用test数据库

    MongoDB shell version: 3.2.11
    connecting to: test
    > use test
    switched to db test
    > 
    

    提示已经切换到test数据库

    再比如我们要用一个stu数据库,其实之前没有,但是直接use stu

    > use stu
    switched to db stu
    

    db.foo.insert(...) 向集合foo插入文档

    只有当我们向这个数据库里插入数据,这个数据库才会真正建立

    比如我们现在先 use test 切换到 test数据库

    然后插入一条数据:

    集合是blogg

    > use test
    switched to db test
    > db.blogg.insert({'id':1,'title':'myblog'})
    WriteResult({ "nInserted" : 1 })
    > 
    

    WriteResult,这两个键值对 就插入成功了。

    也可以这样,预先定义你要插入的内容

    > d = {'id':2,'title':'yourblog'}
    { "id" : 2, "title" : "yourblog" }
    > db.blogg.insert(d)
    WriteResult({ "nInserted" : 1 })
    

    我们查询一下

    db.foo.find() 查询集合foo文档

    多插2条,查询:

    > db.blogg.insert({'id':2,'title':'myblog2'})
    WriteResult({ "nInserted" : 1 })
    > db.blogg.insert({'id':3,'title':'myblog3'})
    WriteResult({ "nInserted" : 1 })
    > db.blogg.find()
    { "_id" : ObjectId("5967cc37f9e6f46246252b79"), "id" : 1, "title" : "myblog" }
    { "_id" : ObjectId("5967cc9bf9e6f46246252b7a"), "id" : 2, "title" : "myblog2" }
    { "_id" : ObjectId("5967cca0f9e6f46246252b7b"), "id" : 3, "title" : "myblog3" }
    

    db.foo.findOne() 查询集合foo文档,显示方式不同.

    注意这里O是大写

    > db.blogg.findOne()
    {
    	"_id" : ObjectId("5967cc37f9e6f46246252b79"),
    	"id" : 1,
    	"title" : "myblog"
    }
    

    查询带条件

    比如我只要id为2的

    > db.blogg.findOne({'id':2})
    {
    	"_id" : ObjectId("5967cc9bf9e6f46246252b7a"),
    	"id" : 2,
    	"title" : "myblog2"
    }
    
    > db.blogg.insert({'id':2,'title':'myblog2'})
    WriteResult({ "nInserted" : 1 })
    > db.blogg.find()
    { "_id" : ObjectId("5967cc37f9e6f46246252b79"), "id" : 1, "title" : "myblog" }
    { "_id" : ObjectId("5967cc9bf9e6f46246252b7a"), "id" : 2, "title" : "myblog2" }
    { "_id" : ObjectId("5967cca0f9e6f46246252b7b"), "id" : 3, "title" : "myblog3" }
    { "_id" : ObjectId("5967cd30f9e6f46246252b7c"), "id" : 2, "title" : "myblog2" }
    
    
    > db.blogg.find({'id':2})
    { "_id" : ObjectId("5967cc9bf9e6f46246252b7a"), "id" : 2, "title" : "myblog2" }
    { "_id" : ObjectId("5967cd30f9e6f46246252b7c"), "id" : 2, "title" : "myblog2" }
    

    这里的 "_id "是mongodb 自己创建的。每个文档的id不一样

    db.foo.update() 更新文档

    update 修改器 ---set

    比如我们 增加或修改指定键值对

    修改 id 为1 title 从myblog改成myblog1

    > db.blogg.find()
    { "_id" : ObjectId("5967cc37f9e6f46246252b79"), "id" : 1, "title" : "myblog" }
    { "_id" : ObjectId("5967cc9bf9e6f46246252b7a"), "id" : 2, "title" : "myblog2" }
    { "_id" : ObjectId("5967cca0f9e6f46246252b7b"), "id" : 3, "title" : "myblog3" }
    { "_id" : ObjectId("5967cd30f9e6f46246252b7c"), "id" : 2, "title" : "myblog2" }
    { "_id" : ObjectId("5967cdc4f9e6f46246252b7d"), "id" : 2, "title" : "yourblog" }
    > db.blogg.update({'id':1},{'$set':{'title':'myblog1'}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.blogg.find()
    { "_id" : ObjectId("5967cc37f9e6f46246252b79"), "id" : 1, "title" : "myblog1" }
    { "_id" : ObjectId("5967cc9bf9e6f46246252b7a"), "id" : 2, "title" : "myblog2" }
    { "_id" : ObjectId("5967cca0f9e6f46246252b7b"), "id" : 3, "title" : "myblog3" }
    { "_id" : ObjectId("5967cd30f9e6f46246252b7c"), "id" : 2, "title" : "myblog2" }
    { "_id" : ObjectId("5967cdc4f9e6f46246252b7d"), "id" : 2, "title" : "yourblog" }
    

    若没找到,则新建 键值对:

    比如 id为1的 再插入一条 titile-2 ,myblog1-2

    > db.blogg.update({'id':1},{'$set':{'title-2':'myblog1-2'}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.blogg.find({'id':1})
    { "_id" : ObjectId("5967cc37f9e6f46246252b79"), "id" : 1, "title" : "myblog1", "title-2" : "myblog1-2" }
    > 
    
    删除就是 unset
    > db.blogg.update({'id':1},{'$unset':{'title-2':'myblog1-2'}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.blogg.find({'id':1})
    { "_id" : ObjectId("5967cc37f9e6f46246252b79"), "id" : 1, "title" : "myblog1" }
    > 
    
    inc修改器 增减指定键的值 默认修改第一个

    比如修改id 的值,增加可以为负数 比如 -2

    > db.blogg.update({'id':1},{'$inc':{'id':-2}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.blogg.find()
    { "_id" : ObjectId("5967cc37f9e6f46246252b79"), "id" : -1, "title" : "myblog1" }
    { "_id" : ObjectId("5967cc9bf9e6f46246252b7a"), "id" : 2, "title" : "myblog2" }
    { "_id" : ObjectId("5967cca0f9e6f46246252b7b"), "id" : 3, "title" : "myblog3" }
    { "_id" : ObjectId("5967cd30f9e6f46246252b7c"), "id" : 2, "title" : "myblog2" }
    { "_id" : ObjectId("5967cdc4f9e6f46246252b7d"), "id" : 2, "title" : "yourblog" }
    > 
    

    见到了之后,操作后变成了id -1

    第三个参数 true 的话 则无匹配创建,有匹配更新

    比如修改id 为 -1 的 记录,发现没有 size 则新建了。

    > db.blogg.update({'id':-1},{'$set':{'size':10}},true)
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.blogg.find({'id':-1})
    { "_id" : ObjectId("5967cc37f9e6f46246252b79"), "id" : -1, "title" : "myblog1", "size" : 10 }
    > 
    
    第四个参数 true 表示 更新匹配多个文档

    比如三个id为2的文档,匹配的3个都被新增了 size 为7 的键值对。

    > db.blogg.find()
    { "_id" : ObjectId("5967cc37f9e6f46246252b79"), "id" : -1, "title" : "myblog1", "size" : 10 }
    { "_id" : ObjectId("5967cc9bf9e6f46246252b7a"), "id" : 2, "title" : "myblog2" }
    { "_id" : ObjectId("5967cca0f9e6f46246252b7b"), "id" : 3, "title" : "myblog3" }
    { "_id" : ObjectId("5967cd30f9e6f46246252b7c"), "id" : 2, "title" : "myblog2" }
    { "_id" : ObjectId("5967cdc4f9e6f46246252b7d"), "id" : 2, "title" : "yourblog" }
    > db.blogg.update({'id':2},{'$set':{'size':7}},false,true)
    WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
    > db.blogg.find()
    { "_id" : ObjectId("5967cc37f9e6f46246252b79"), "id" : -1, "title" : "myblog1", "size" : 10 }
    { "_id" : ObjectId("5967cc9bf9e6f46246252b7a"), "id" : 2, "title" : "myblog2", "size" : 7 }
    { "_id" : ObjectId("5967cca0f9e6f46246252b7b"), "id" : 3, "title" : "myblog3" }
    { "_id" : ObjectId("5967cd30f9e6f46246252b7c"), "id" : 2, "title" : "myblog2", "size" : 7 }
    { "_id" : ObjectId("5967cdc4f9e6f46246252b7d"), "id" : 2, "title" : "yourblog", "size" : 7 }
    > 
    

    删除 db.foo.remove()

    > db.blogg.find()
    { "_id" : ObjectId("5967cc37f9e6f46246252b79"), "id" : -1, "title" : "myblog1", "size" : 10 }
    { "_id" : ObjectId("5967cc9bf9e6f46246252b7a"), "id" : 2, "title" : "myblog2", "size" : 7 }
    { "_id" : ObjectId("5967cca0f9e6f46246252b7b"), "id" : 3, "title" : "myblog3" }
    { "_id" : ObjectId("5967cd30f9e6f46246252b7c"), "id" : 2, "title" : "myblog2", "size" : 7 }
    { "_id" : ObjectId("5967cdc4f9e6f46246252b7d"), "id" : 2, "title" : "yourblog", "size" : 7 }
    > db.blogg.remove({'id':3})
    WriteResult({ "nRemoved" : 1 })
    > db.blogg.find()
    { "_id" : ObjectId("5967cc37f9e6f46246252b79"), "id" : -1, "title" : "myblog1", "size" : 10 }
    { "_id" : ObjectId("5967cc9bf9e6f46246252b7a"), "id" : 2, "title" : "myblog2", "size" : 7 }
    { "_id" : ObjectId("5967cd30f9e6f46246252b7c"), "id" : 2, "title" : "myblog2", "size" : 7 }
    { "_id" : ObjectId("5967cdc4f9e6f46246252b7d"), "id" : 2, "title" : "yourblog", "size" : 7 }
    > 
    

    id = 3 被删除了

    其他命令

    show dbs 显示数据库

    show collections 显示集合

    db.blogg.drop() 删除该集合

    db.dropDatabase()删除整个数据库

    Jonny

    2017年07月14日 08时42分45秒

  • 相关阅读:
    (C#)TreeView控件综合实例
    C#语言命名规则
    C#基础全接触
    (C#)GDI+简单绘图画矩形
    (C#)GDI+简单绘图画曲线
    C#拆箱与装箱之代码优化
    (C#)GDI+绘图之鼠标移动画图
    近期学习计划
    MS_SQL_杂记(一)
    别在迷恋正则表达式解析html了,好吗?
  • 原文地址:https://www.cnblogs.com/znan/p/7168309.html
Copyright © 2011-2022 走看看