MongoDB的基础使用及python操作MongoDB

一、MongoDB介绍

        MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

        层级关系:db -> collection -> document.

二、MongoDB的基础

        本文使用Linux系统操作MongoDB,MongoDB已安装好,安装和启动就不在赘述。

(一)、进入和退出MongoDB

        输入命令 mongo 即可进入系统,显示如下:

 
  1. vip@Vip:~$ mongo

  2. MongoDB shell version: 2.6.10

  3. connecting to: test

  4. Server has startup warnings:

  5. 2018-07-10T13:19:03.789+0800 [initandlisten]

  6. 2018-07-10T13:19:03.789+0800 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary.

  7. 2018-07-10T13:19:03.789+0800 [initandlisten] ** 32 bit builds are limited to less than 2GB of data (or less with --journal).

  8. 2018-07-10T13:19:03.789+0800 [initandlisten] ** See http://dochub.mongodb.org/core/32bit

  9. 2018-07-10T13:19:03.789+0800 [initandlisten]

        退出输入 exit  即可。

(二)、数据库db操作

(1)数据库的创建和查看

        输入命令 use database_name 即可创建数据库,查看所有数据库,可以使用 show dbs 命令,注意如果该数据库中没有集合则该数据库不会显示在界面中,输入命令 db 可以查看当前库。

 
  1. > show dbs

  2. amdin 0.078GB

  3. local 0.078GB

  4. > use moyu

  5. switched to db moyu

  6. > show dbs

  7. amdin 0.078GB

  8. local 0.078GB

  9. > db.createCollection('user')

  10. { "ok" : 1 }

  11. > show dbs

  12. amdin 0.078GB

  13. local 0.078GB

  14. moyu 0.078GB

  15. > db

  16. moyu

(2)数据库的删除

        首先切换到要删除的数据库 use db ,使用db.dropDatabase() 即可删除。

 
  1. > show dbs

  2. amdin 0.078GB

  3. local 0.078GB

  4. moyu 0.078GB

  5. > use moyu

  6. switched to db moyu

  7. > db.dropDatabase()

  8. { "dropped" : "moyu", "ok" : 1 }

  9. > show dbs

  10. amdin 0.078GB

  11. local 0.078GB

(三)、管理集合

        管理集合有:查看当前数据库的集合 show collections 、集合的创建 db.createCollection(name, options) 、删除集合 db.集合名称.drop() 。

 
  1. > use moyu

  2. switched to db moyu

  3. > db.createCollection('user')

  4. { "ok" : 1 }

  5. > show collections

  6. system.indexes

  7. user

  8. > db.user.drop()

  9. true

  10. > show collections

  11. system.indexes

参数说明:

  • name: 要创建的集合名称
  • options: 可选参数, 指定有关内存大小及索引的选项
字段 类型 描述
capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。
当该值为 true 时,必须指定 size 参数。
autoIndexId 布尔 (可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size 数值 (可选)为固定集合指定一个最大值(以字节计)。
如果 capped 为 true,也需要指定该字段。
max 数值 (可选)指定固定集合中包含文档的最大数量。

 使用如下:

 
  1. > db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000})

  2. { "ok" : 1 }

  3. > show collections

  4. mycol

  5. system.indexes

在 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。

(四)、文档操作

(1)、插入文档

        db.集合名称.insert(document),每一条数据,就是一个document。插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectId。

 
  1. > db.user.insert([{name:'moyu',age:20,gender:'male'},{name:'liyi',age:29,gender:'famle'}])

  2. BulkWriteResult({

  3. "writeErrors" : [ ],

  4. "writeConcernErrors" : [ ],

  5. "nInserted" : 2,

  6. "nUpserted" : 0,

  7. "nMatched" : 0,

  8. "nModified" : 0,

  9. "nRemoved" : 0,

  10. "upserted" : [ ]

  11. })

  12. > db.user.find()

  13. { "_id" : ObjectId("5b45f69dec125c1d1dab60d3"), "name" : "moyu", "age" : 20, "gender" : "male" }

  14. { "_id" : ObjectId("5b45f69dec125c1d1dab60d4"), "name" : "liyi", "age" : 29, "gender" : "famle" }

  15. > db.user.insert({_id:2018,name:'gogo',age:55})

  16. WriteResult({ "nInserted" : 1 })

  17. > db.user.find()

  18. { "_id" : ObjectId("5b45f69dec125c1d1dab60d3"), "name" : "moyu", "age" : 20, "gender" : "male" }

  19. { "_id" : ObjectId("5b45f69dec125c1d1dab60d4"), "name" : "liyi", "age" : 29, "gender" : "famle" }

  20. { "_id" : 2018, "name" : "gogo", "age" : 55 }

  21. > db.user.find({_id:2018})

  22. { "_id" : 2018, "name" : "gogo", "age" : 55 }

        这样查询的数据是不是很不美观么,没关系我们加一个pretty,自己动手实验一下吧~ db.user.find().pretty()

(2)、更新文档

        使用update() 方法用于更新已存在的文档,格式如下:

 
  1. db.collection.update(

  2. <query>,

  3. <update>,

  4. {

  5. upsert: <boolean>,

  6. multi: <boolean>,

  7. writeConcern: <document>

  8. }

  9. )

参数说明:

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。
 
  1. > db.user.update({'_id':2018},{$set:{'name':'changed'}})

  2. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

  3. > db.user.find({_id:2018}).pretty()

  4. { "_id" : 2018, "name" : "changed", "age" : 55 }

  5. > db.user.find().pretty()

  6. {

  7. "_id" : ObjectId("5b45f69dec125c1d1dab60d3"),

  8. "name" : "moyu",

  9. "age" : 20,

  10. "gender" : "male"

  11. }

  12. {

  13. "_id" : ObjectId("5b45f69dec125c1d1dab60d4"),

  14. "name" : "liyi",

  15. "age" : 29,

  16. "gender" : "famle"

  17. }

  18. { "_id" : 2018, "name" : "changed", "age" : 55 }

  19. >

注意:

①如果此处未使用操作符$set 则会对此条文档进行了一个覆盖。

 
  1. > db.user.update({'_id':2018},{'name':'changed'})

  2. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

  3. > db.user.find({'_id':2018}).pretty()

  4. { "_id" : 2018, "name" : "changed" }

②查询条件query查到多条时会只更新第一条文档,要更新多条需要添加 { multi: ture },并且使用操作符$set指定更新的字段。

 
  1. > db.user.find()

  2. { "_id" : ObjectId("5b45f69dec125c1d1dab60d3"), "name" : "moyu", "age" : 20, "gender" : "male" }

  3. { "_id" : ObjectId("5b45f69dec125c1d1dab60d4"), "name" : "liyi", "age" : 29, "gender" : "famle" }

  4. { "_id" : 2018, "name" : "changed" }

  5. { "_id" : ObjectId("5b4622e7ec125c1d1dab60d5"), "name" : "liyi", "age" : 22 }

  6.  
  7. > db.user.update({'name':'liyi'},{$set:{'age':25}})

  8. WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

  9. > db.user.find()

  10. { "_id" : ObjectId("5b45f69dec125c1d1dab60d3"), "name" : "moyu", "age" : 20, "gender" : "male" }

  11. { "_id" : ObjectId("5b45f69dec125c1d1dab60d4"), "name" : "liyi", "age" : 25, "gender" : "famle" }

  12. { "_id" : 2018, "name" : "changed" }

  13. { "_id" : ObjectId("5b4622e7ec125c1d1dab60d5"), "name" : "liyi", "age" : 22 }

  14.  
 
  1. > db.user.find()

  2. { "_id" : ObjectId("5b45f69dec125c1d1dab60d3"), "name" : "moyu", "age" : 20, "gender" : "male" }

  3. { "_id" : ObjectId("5b45f69dec125c1d1dab60d4"), "name" : "liyi", "age" : 25, "gender" : "famle" }

  4. { "_id" : 2018, "name" : "changed" }

  5. { "_id" : ObjectId("5b4622e7ec125c1d1dab60d5"), "name" : "liyi", "age" : 22 }

  6. > db.user.update({'name':'liyi'},{$set:{'age':25}},{multi:true})

  7. WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 1 })

  8. > db.user.find()

  9. { "_id" : ObjectId("5b45f69dec125c1d1dab60d3"), "name" : "moyu", "age" : 20, "gender" : "male" }

  10. { "_id" : ObjectId("5b45f69dec125c1d1dab60d4"), "name" : "liyi", "age" : 25, "gender" : "famle" }

  11. { "_id" : 2018, "name" : "changed" }

  12. { "_id" : ObjectId("5b4622e7ec125c1d1dab60d5"), "name" : "liyi", "age" : 25 }

(3)、删除文档

使用remove() 方法的基本语法格式如下所示:

 
  1. db.collection.remove(

  2. <query>,

  3. {

  4. justOne: <boolean>,

  5. writeConcern: <document>

  6. }

  7. )

参数说明:

  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档。
  • writeConcern :(可选)抛出异常的级别。
 
  1. > db.user.remove({'age':25},{justOne:true})

  2. WriteResult({ "nRemoved" : 1 })

三、使用Python操作MongoDB

环境:

Python:3.5   IDE:pycharm  系统:Ubuntu

自行安装pymongo(pip install pymongo)

 
  1. import pymongo

  2.  
  3. # 连接到MongoDB ip地址+端口号

  4. client = pymongo.MongoClient('127.0.0.1',27017)

  5.  
  6. #指定数据库

  7. db = client['moyu']

  8. #指定集合

  9. info = db['info']

  10.  
  11. #插入一条文档

  12. doc_one = {'name':'woo', 'age':33, 'gender':'male'}

  13. info.insert_one(doc_one)

  14.  
  15. #插入多条文档

  16. doc_many = [{'name':'woo', 'age':33, 'gender':'male'},{'name':'hello', 'age':44, 'gender':'female'}]

  17. info.insert_many(doc_many)

  18.  
  19. #更新 name是woo 的name 为changed

  20. #同样的也是只更新第一条文档

  21. info.update({'name':'woo'},{'$set':{'name':'changed'}})

  22. #更新多条

  23. info.update({'name':'woo'},{'$set':{'name':'changed'}},{'multi':'true'})

  24.  
  25. #删除一条文档,多条去掉justOne

  26. info.remove({'name':'woo'},{'justOne':'true'})

  27.  
  28. #集合查询

  29. data = info.find({'name':'woo'})

  30. for item in data:

  31. print(item)

猜你喜欢

转载自blog.csdn.net/IAlexanderI/article/details/81458141