MongoDB与pymongo学习笔记

一、什么是MongoDB?

  1) MongoDB是有C++编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加多的节点,可以保证服务器性能。

  2) MongoDB旨在为web应用提供可扩展的高性能数据存储解决方案。

  3)MongoDB将数据存储为一个文档,数据结构由键值key->value对组成,MongoDB文档类型类似于json对象,字段值可以包含其他文档、数组及文档数组。


二、操作Mongo数据库

  1. 使用/创建数据库:use 数据库名,如果数据库不存在则创建,否则切换至指定数据库。

  ==> 如果是新创建数据库后使用show dbs,发现创建的数据库不在列表内,则需要向数据库中插入一条数据后才能展示出来

  2. 删除数据库:db.dropDatabase()

  ==> 前提:使用当前数据库

  3. 查看所有数据:show dbs

  4. 查看当前正在使用的数据库:1)db      2)db.getName()

  5. 断开连接:exit

  6. 查看命令api:help

三、集合操作

  1. 查看当前数据库下有哪些集合:show collections

  2. 创建集合

  ==> db.createCollection("集合名")

  ==> db.集合名.insert({name:"yxj", age:18, gender:1, address:"四川", isDelete:false})

  ==> 区别:前者是创建一个空的集合,后者是创建一个空的集合并添加一个文档。

  3. 删除当前数据库中的集合

  ==> db.集合名.drop()

四、文档操作(重点)

  1. 插入文档

  ==> 使用insert()方法:db.集合名.insert(文档)

    可以插入一条,也可以插入多条。db.集合名.insert([文档1, 文档2, 文档3, ...])

    栗子:db.student.insert({name:"yxj", age:18, gender:1, address:"四川", isDelete:false})

    db.student.insert([{name:"yxj", age:18, gender:1, address:"四川", isDelete:false},{name:"yh", age:20, gender:0, address:"山西", isDelete:false}])

  ==> 使用save()方法:db.集合名.save(文档)

    如果不指定_id字段,save()同insert(),如果指定_id字段,则会更新_id字段的数据

    栗子:db.student.save({name:"yxj", age:18, gender:1, address:"四川", isDelete:false})

    db.student.insert({_id:ObjectId("5f32658cad6df702d29bf9a3"), name:"yxj", age:18, gender:1, address:"四川", isDelete:false})

  2. 更新文档
  ==> update()方法:
    db.集合名.update(
      query,
      update,
      {
        upset:<boolean>,
        multi:<boolean>,
        writeConcern:<document>
      }
    )
    参数说明:
      query:update的查询条件,类似于sql中的update语句内的where子句后的内容
      update:update的对象和一些更新的操作符($set,$inc等)。$set:直接更新,$inc:在原有的基础上累加后更新
      upset:可选,如果不存在update的记录,是否用作新数据插入进去,默认为false
      multi:可选,只更新找到的第一条记录,默认为false,如果为true,则更新查找出来的所有数据
      writeConcern:可选,抛出异常的级别

    栗子:db.student.update({name:"yxj"},{$set:{age:3}})
                  ⬇      ⬇
                 query    update
  ==> save()方法
  区别:update方法用于更新已存在的文档,save通过传入的文档替换已有文档(伪更新)


  3. 删除文档
    说明:在执行删除remove()方法前,先执行find()方法查找要删除的数据是否存在。
  ==> remove()方法:
    db.集合名.remove(
      query,
      {
        justOne:<boolean>,
        writeConcern:<document>
      }
    )
    参数说明:
      query:可选,筛选要删除的文档的条件,不指定时,删除全部文档
      justOne:可选,值为true/1时,只删除一个文档
    栗子:db.student.remove({name:"yh"})

  4. 查询文档
  ==> find()方法:db.集合名.find()
  栗子:db.student.find()
  ==> find()方法查询指定列:
    db.集合名.find(
      query,
      {
        <key>:1,
        <key>:1,
      }
    )
    参数说明:
      query:查询条件
      key:要显示的字段,1表示显示
    栗子:db.student.find({gender:0}, {name:1, age:1})
  ==> pretty()方法:以格式化的方式来显示文档
  db.集合名.find().pretty()
  ==> findOne()方法:查询匹配结果的第一条数据
  db.集合名.findOne()

  5. 查询条件操作符
    条件操作符用于比较两个表达式并从MongoDB集合中获取数据。
  ==> 大于操作:$gt
    db.集合名.find({<key>:{$gt:<value>}})
    栗子:db.student.find({age:{$gt:20}})             #  年龄>20
  ==> 大于等于操作:$gte
    db.集合名.find({<key>:{$gte:<value>}})
  ==> 小于操作:$lt
    db.集合名.find({<key>:{$lt:<value>}})
  ==> 小于等于操作:$lte
    db.集合名.find({<key>:{$lte:<value>}})
  ==> 等于操作:
    db.集合名.find({<key>:<value>})
  ==> 大于等于和小于等于:
    db.集合名.find({<key>:{$gte:<value>, $lte:<value>}})
  ==> 使用_id进行查询:
    db.集合名.find({"_id":ObjectId("id值")})
  ==> 查询某个结果集的数据条数:
    db.集合名.find().count()
  ==> 查询某个字段的值当中是否包含另一个值:
    db.集合名.find({name:/包含值/})
    栗子:db.student.find({name: /xj/})        # 名字中包含xj的
  ==> 查询某个字段的值是否以另一个值开头:
    db.集合名.find({name:/^包含值/})
    栗子:db.student.find({name: /^y/})       # 名字以y开头的

  6. 条件查询 and 和 or
  ==> and条件:
    db.集合名.find({条件1, 条件2, 条件3, ... , 条件n})
    栗子:db.student.find({gender:1, age:{$gt:18}})        # 性别为男,且年龄大于18的
  ==> or条件:
    db.集合名.find({$or: [{条件1}, {条件2}, {条件3}, ... , {条件n}]})
    栗子:db.student.find({$or: [{age:17}, {age:{$gt: 20}}]})         # 年龄等于17或者大于20的
  ==> and和or联合使用:
    db.集合名.find({条件1, 条件2, $or:[条件1, 条件2, 条件3, ... , 条件n]})

  7. limit 和 skip
  ==> limit()方法:读取指定数量的数据记录
    db.集合名.find().limit(数字)
  ==> skip()方法:跳过指定数量的数据
    db.集合名.find().skip(数字)
  ==> skip()方法与limit()方法联合使用:用于实现数据分页
    db.集合名.find().skip(数字).limit(数字)

  8. 排序
  ==> sort()方法
    db.集合名.find().sort({<key>:1/-1})            # 1 升序    -1 降序
    栗子:db.student.find().sort({age:1})         #  按照年龄升序排序

 五、pymongo的使用

  1. 安装:pip install pymongo

  2. 使用

  ==> 添加文档:

from pymongo import MongoClient

# 连接服务器
# conn = MongoClient(host, port)
conn = MongoClient("host", 27017)     # host:主机地址,mongo默认端口号:27017

# 连接数据库
# 方法一:db = conn.数据库名
# 方法二:db = conn["数据库名"]
db = conn["mydb"]
# 认证,如果数据库未设置,则可省略此步骤
db.authenticate("name", "password")

# 获取集合
# 方法一:collection = db.集合名
# 方法二:collection = db["集合名"]
collection = db["student"]

# 添加文档
collection.insert({"name": "yanxiujuan", "age": 18, "gender": 0})

# 断开连接
conn.close()

  ==> 更新文档

from pymongo import MongoClient

client = MongoClient("host", 27017)

db = client["db_name"]
collection = db["collection_name"]

# 更新文档
collection.update({"name": "yxj"}, {"$set": {"age": 18}})

client.close()

  ==> 删除文档

from pymongo import MongoClient

client = MongoClient("host", 27017)

db = client["db_name"]
collection = db["collection_name"]

# 删除文档
collection.remove({"name": "yxj"})

client.close()

  ==> 查询文档(重点)

from pymongo import MongoClient
from bson.objectid import ObjectId
import pymongo


client = MongoClient("host", 27017)

db = client.mydb

collection = db.student

# 查询文档
result = collection.find({"age": {"$gt": 18}})

# 如果是多条数据,使用for循环取数据
for row in result:
    print(row)
    print(type(row))     # dict类型

# 统计查询
result2 = collection.find({"age": {"$gt": 18}}).count()

# 根据id查询 --> 需要引入三方库 from bson.objectid import ObjectId
result3 = collection.find({"_id": ObjectId("id值")})

# 排序
# 1)升序
result4 = collection.find({}).sort("age")
# 2)降序 --> 需要引入pymongo库 import pymongo
result5 = collection.find({}).sort("age", pymongo.DESCENDING)

# 分页
result6 = collection.find().skip(3).limit(5)    # 跳过3条,拿5条

client.close()
原文地址:https://www.cnblogs.com/panpanda/p/13810172.html