MongoDB:安装及使用

MongoDB

一、初识MongoDB

  MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

  MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

  简单说,MongoDB和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等。关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的概念,MongoDB中也同样有以上的概念,,但是名称发生了一些变化,严格意义上来说,两者的概念即为相似,但又有些出入,不过无所谓,我们就当是以上概念就好啦。

  用如下示例进一步说明:

  这是我们用关系型数据库做的一张很简单的user表:

  id   name    age     gender
  1    刘涛     36      female
  2    孙红雷   40       male
  3    马伊利   35      female

  在MongoDB的数据结构如下:

复制代码
  user = [
    {
      "id": 1,
      "name": "刘涛",
      "age": 36,
      "gender": female
    },
    {
      "id": 2,
      "name": "孙红雷",
      "age": 40,
      "gender": male
    },
    {
      "id": 3,
      "name": "马伊利",
      "age": 35,
      "gender": female
    }
  ]
复制代码

  看到这里,你发现这不就是一个列表,里面放着三个字典吗?你说的对,如果你理解成了列表和字典,那么证明了你只会Python,在其他语言中它又是别的类型了,我们把这种类型叫做Json。

  那么你应该恍然大悟了吧,MongoDB的每个表(Collection)中存储的每条数据(Documents)都是一个一个的Json,Json中的每一个字段(Key)我们称之为Field,就此我们引出了三个关键字:Collection也就是关系型数据库中"表"的概念,Documents就是"数据条目",Field就是"字段"。

二、安装MongoDB

  接下来在你的电脑上安装MongoDB,本文以3.4版本为例,安装过程一路下一步即可,完成后找到安装目录下的bin目录,将其加入环境变量。

  注意:安装完成后打开终端,输入mongod,会显示如下错误信息:

                         

  我们可以手动在上述提示目录,即c盘创建data\db目录,若不想放在c盘,也可以在其他磁盘,如d盘创建,如下:

                                           

  此时就可以成功开启mongodb服务了,且要指定mongodb的数据存放目录,如下:                  

                                   

  开启服务端后再打开一个终端开启mongo的客户端,如下:

                                  

  接下来就可以进行mongodb的操作了,如下图:

                               

  注意:由上图我们发现,mongodb中使用了不存在的对象,就代表创建对象,接下来我们使用这以结论创建一张表(collection),如下图:

                                 

三、MongoDB的数据类型

ObjectID :Documents 自生成的 _id;
String: 字符串,必须是utf-8;
Boolean:布尔值,true 或者false (注意,这里首字母要小写);
Integer:整数 (Int32、Int64,就知道有个Int就行了,一般我们用Int32);
Double:浮点数 (没有float类型,所有小数都是Double);
Arrays:数组或者列表,多个值存储到一个键;
Object:相当于Python中的字典;
Null:空数据类型;
Timestamp:时间戳;
Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型); 

  这里我们重点说一下ObjectID类型,它是MongoDB生成的类似关系型DB表主键的唯一key,具体由24个字节组成:

  1-8字节是时间戳;

  9-14字节的机器标识符,表示MongoDB实例所在机器的不同;

  15-18字节的进程id,表示相同机器的不同MongoDB进程;

  19-24字节是计数器;

                      

"_id" : ObjectId("5c3ee043949505956bbf9b33")

#"5c3ee043" 代指的是时间戳,这条数据的产生时间;
#"949505" 代指某台机器的机器码,存储这条数据时的机器编号;
#"956b" 代指进程ID,多进程存储数据的时候,非常有用的;
#"bf9b33" 代指计数器,这里要注意的是,计数器的数字可能会出现重复,不是唯一的;
# 以上四种标识符拼凑成世界上唯一的ObjectID
# 只要是支持MongoDB的语言,都会有一个或多个方法,对ObjectID进行转换
# 注意:这个类型是不可以被JSON序列化的

四、MongoDB的增删改查

one: 都是查询到的符合条件的第一条
many: 查询的符合条件的所有条件

1、查询 find

db.tablename.find({age:2})
db.tablename.findOne({age:2})   # 查询符合年龄为2的第一条记录

 

2、插入 insert

db.tablename.insert([{},{}])    # 不推荐
db.tablename.insertOne({"id":1,"name":"jwb"})
db.tablename.insertMany({"id":1,"name":"jwb"},{"id":2,"name":"chen"})

 

3、删除 delete

db.tablename.remove({})         # 不推荐
db.tablename.deleteOne({"name":"chen"})    # 删除符合条件的第一条
db.tablename.deleteMany({"name":"age"})    # 删除符合条件的所有

 

4、修改 update 

db.tablename.update({条件},{$set:{filed:value}})   # 不推荐
db.tablename.updateOne({"name":"chen"},{$set:{"name":"zhang"}})    
db.tablename.updateMany({"name":"chen"},{$set:{"name":"zhang"}})

 

5、update中的修改器

$set                # 强制修改
$unset            # 强制删除
$inc          # 1 -1      # 原有的基础上增加或减少1

db.tablename.updateOne({id:22},{$unset:{hobby:44}})  # 删除id2记录中的hobby的44
db.tablename.updataOne({"age":"21"},{$inc:{"age":1}})   # 修改后为22
db.user.updateMany({},{$inc:{age:1}})    #在原值的基础上都增加

 

6、array数组中的修改器:

       $push       # 增加

       $pull          # 减少

       $pushAll    # 迭代追加

       $pop        # 1(删除最后一条数据)  -1(删除第一条数据)

db.user.updateOne({"name":"ywb"},{$push:{"hobby":"jwb"}})
db.user.updateOne({"name":"ywb"},{$pull:{"hobby":"jwb"}})
db.user.updateOne({"name":"ywb"},{$pushAll: {"hobby":[1,2,3]}})
db.user.updateOne({"name":"ywb"},{$pop:{"hobby":1}})    #删除最后一条
db.user.updateOne({"name":"ywb"},{$pop:{"hobby":-1}})   #删除第一条

 

7、$ 字符

  $: 符合条件的元素的下标索引,只能在array当中使用

[1,4,5,2,1]  $=0
updateOne({list:1},{$set:{"list.$":6}})   #$=0

总结:

       1、$存放符合条件元素的下标索引

       2、$只能存放一个下标

       3、符合条件元素有多个时,只能存放第一个元素的下标

 

8、查询条件

  并列、$or(或)、$in (子集)、$all (完全符合)

并列(逗号隔开)
    db.tablename.find({age:73},{name:"ywb"})

$or 或  
    db.tablename.find({$or:[{age:73},{name:"ywb"}]})  # 语法({$or:[{},{}]})

$in 子集
    db.tablename.find({age:{$in:[1,2,3,4,5]}})  #子集,在....里,列表中元素的位置可以变化

$all 完全符合
    db.tablename.find({age:{$all:[1,2,3,4,5]}})  #完全符合,元素位置可以发生变化

 

9、判断条件

$gt    大于

$gte   大于等于

$lt     小于

$lte    小于等于

$eq    等于

db.tablename.find({age:{$gt:20}})   #查询年龄大于20岁的

 

10、MongoDB中的跳过选取排序

       skip(5)     跳过五条数据

       limit(5)     只显示五条数据

       sort({age:1})     正序

       sort({age:-1})    倒序

db.tablename.find({条件}).sort({"age":1}).skip(5).limit(5)

db.tablename.find({"age":{$all:[1,2,3,4]}}).sort({"key":-1})
db.tablename.find({"age":{$all:[1,2,3,4]}}).limit(5)  #只显示当前位置向下5条
db.tablename.find({"age":{$all:[1,2,3,4]}}).skip(5)  #跳过五条数据,决定当前位置

  总结:   

              执行顺序:sort()  >  skip()  >   limit()

              书写顺序:没有顺序,可以随意调换

 

11、Object操作

db.user.updateOne({"kecheng.name":"python"},{$set:{"kecheng.price":19800}})
db.user.updateOne({"kecheng.name":"python"},{$inc:{"kecheng.price":500}})

 

12、重点!!!!!!!

# Array中的Object:
db.user.updateOne({"hobby.age":84},{$set:{"hobby.$.age":73}})

# Object中的Array:
db.user.updateOne({"kecheng.class":15},{$set:{"kecheng.class.$":20}})

pymongodb

 基本语法

find_one
insert_one
insert_many
update_one
update_many
delete_one
delete_many

sort("key",1)

 

类似pymysql,pymongo是python中操作mongodb数据库的模块。

1、安装

pip3 install pymongo

 

2、使用pymongo

  1)增加

  import pymongo

  mongoclient = pymongo.MongoClient(host="127.0.0.1", port=27017)
  MongoDB = mongoclient["db1"]   # db1是mongodb中的一个数据库

  res = MongoDB.userinfo.insert_one({"name":"wusir", "age":32})

  print(res)  
  # <pymongo.results.InsertOneResult object at 0x0000019DEA5B6FC8>
  print(type(res))  # <class 'pymongo.results.InsertOneResult'>
  print(res.inserted_id) # 5c3eee24cf0e440838f79d3a
  print(type(res.inserted_id)) # <class 'bson.objectid.ObjectId'>

  res = MongoDB.userinfo.insert_many([
      {"name":"张三", "age":30},
      {"name":"李四", "age":18}
  ])

  print(res)  
  # <pymongo.results.InsertManyResult object at 0x000001DE80351088>
  print(type(res))  # <class 'pymongo.results.InsertManyResult'>
  print(res.inserted_ids) # [ObjectId('5c3eef71cf0e440ba4f5c40d'), ObjectId('5c3eef71cf0e440ba4f5c40e')]

  总结:

    - insert_one()插入数据一条数据(documents),返回值的inserted_id表示插入数据的"_id"值,ObjectID类型;

    - insert_many([])插入多条数据(documents),返回值的inserted_ids表示插入数据的"_id"值组成的列表,列表中的元素也是ObjectID类型;

  2)查询

  import pymongo

  mongoclient = pymongo.MongoClient(host="127.0.0.1", port=27017)
  MongoDB = mongoclient["db1"]   # db1是mongodb中的一个数据库
  
  res = MongoDB.userinfo.find_one()  # 查询一条数据,返回字典
  print(res)
  # {'_id': ObjectId('5c3ee043949505956bbf9b33'), 'name': 'tom', 'age': 12.0}

  res = MongoDB.userinfo.find()  # 查询所有数据,返回cursor对象,可迭代
  print(res)
  # <pymongo.cursor.Cursor object at 0x0000016CF07D7358>
  print(list(res))
  # [{'_id': ObjectId('5c3ee043949505956bbf9b33'), 'name': 'tom', 'age': 12.0}, 
  # {'_id': ObjectId('5c3eed9dcf0e440980eb4e45'), 'name': 'alex', 'age': 38}, 
  # {'_id': ObjectId('5c3eee24cf0e440838f79d3a'), 'name': 'wusir', 'age': 32}, 
  # {'_id': ObjectId('5c3eef71cf0e440ba4f5c40d'), 'name': '张三', 'age': 30}, 
  # {'_id': ObjectId('5c3eef71cf0e440ba4f5c40e'), 'name': '李四', 'age': 18}]

  注意:同mongodb一样,pymongo也可以find({条件},{排除字段})或者find_one({条件},{排除字段})

  3)修改

  import pymongo

  mongoclient = pymongo.MongoClient(host="127.0.0.1", port=27017)
  MongoDB = mongoclient["db1"]   # db1是mongodb中的一个数据库

  res = MongoDB.userinfo.update_one({"name":"tom"},{"$set":{"age":15}})

  print(res)
  # <pymongo.results.UpdateResult object at 0x000001A888325E08>
  print(dir(res))
  # [..., '__delattr__',..., 'raw_result', 'upserted_id']

  res = MongoDB.userinfo.update_many({"age":15},{"$set":{"age":22}})
  print(res.raw_result)  # 修改结果,包括影响行数,是否存在需要修改的数据等
  # {'n': 2, 'nModified': 2, 'ok': 1.0, 'updatedExisting': True}

  总结:除上例中的$set之外,$push、$pull等方法都可以使用。

  4)删除

  import pymongo

  mongoclient = pymongo.MongoClient(host="127.0.0.1", port=27017)
  MongoDB = mongoclient["db1"]   # db1是mongodb中的一个数据库

  res = MongoDB.userinfo.delete_one({"name":"wusir"})
  res = MongoDB.userinfo.delete_many({"age":22})

  5)sort、limit、skip

  import pymongo

  mongoclient = pymongo.MongoClient(host="127.0.0.1", port=27017)
  MongoDB = mongoclient["db1"]   # db1是mongodb中的一个数据库

  res = MongoDB.userinfo.find().skip(2).limit(2)  # 跳过两条,显示两条
  print(list(res))

  # pymongo.ASCENDING表示升序,pymongo.DESCENDING表示降序
  res = MongoDB.userinfo.find().sort("age", pymongo.ASCENDING)
  print(list(res))
  res = MongoDB.userinfo.find().sort("age", pymongo.DESCENDING)
  print(list(res))

  6)字符串类型与ObjectID类型的相互转换

    我们知道ObjectID不能被序列化,而mongodb中的"_id"是ObjectID类型数据,且经常需要将数据json序列化后进行传输,下面介绍字符串类型与ObjectID类型相互转换。

  import pymongo
  from bson import ObjectId

  mongoclient = pymongo.MongoClient(host="127.0.0.1", port=27017)
  MongoDB = mongoclient["db1"]   # db1是mongodb中的一个数据库

  res = MongoDB.userinfo.find_one()
  s = res.get("_id")
  print(s)  # 5c3eef71cf0e440ba4f5c40d
  print(type(s))  # <class 'bson.objectid.ObjectId'>
  print(str(s))  # 5c3eef71cf0e440ba4f5c40d
  print(type(str(s)))  # <class 'str'>

  s = ObjectId("5c3eef71cf0e440ba4f5c40d")      # 强转成ObjectID类型
  res = MongoDB.userinfo.find_one({"_id":s})
  print(res)
  # {'_id': ObjectId('5c3eef71cf0e440ba4f5c40d'), 'name': '张三', 'age': 30}

 


 li-li:

  MongoDB简单使用详解

DragonFire:

  Mongodb详细安装步骤

  mongodb的详细目录

 

posted @ 2019-01-16 15:49  葡萄想柠檬  Views(178)  Comments(0)    收藏  举报
目录代码