zoukankan      html  css  js  c++  java
  • Mongodb 补充

    1 mongodb 概述


    启动mongo

    1 数据库操作

    	没有数据的 集合 和 数据库不会显示
    
    	db     查看当前的数据库名称; 所有物理上存在的数据库
    	
    	db.stats() 查看当前的数据库信息;
    	
    	show dbs   查看所有的数据库
    	
    	use day1   直接创建 并切换数据库
    
    	db.dropDatabase() 删除库,需要先切换到当前库
    
    	exit 退出
    	ctrl + c
    

    2 集合操作

    	db.createCollection("stu")
    	
    	show collections
    
    	show tables
    
    	db.t1.insert({"name":"aaa"})  # 创建 t1 同时 插入数据
    	
    	db.stu.drop()
    

    3 数据类型 和 数据操作

    mongodb的数据类型

    object ID --- 文档ID ---唯一标识
    string 必须是有效的utf-8
    boolean
    integer 整数可以是 32 64的 取决于服务器
    double 储存浮点数
    arrays 数组 列表
    object 文档可以嵌套
    null
    timestamp
    date    new Date()
    

    Object ID

    不重复 文档的唯一性(可以自己定义 没有定义的mongodb会默认)
    
    默认 12字节的 16进制数
    
    前四个字节是当前的时间戳 时间相关
    3个字节 机器ID
    2个字节的MONGODB进程ID
    3个字节 简单的增量值
    

    数据操作:

    插入:(没有 集合会自己创建)
    
      db.stu.insert(document)
      db.stu.insert({name:"gl",gender:0})
    	
       db.stu.insertMany([{},{},{}]) 插入多条记录
    
      自动生成的id : _id" : ObjectId("5a043500ffedb64e1403b240")
    
    查询:
    
      db.stu.find()
    
    修改:
    
    	
    	覆盖式的 修改:
    		
    		db.stu.update({"name":"a"},{"username":"al"})
    
    
      用 $set:{} ($unset:{}删除某个属性)只修改某个属性 --
    
      不用的话 会修改整个文档的结构
    
    
    	  db.stu.update({匹配条件},{$set:{name:"abc"}}) 只改第一个匹配的
    	
    	  db.stu.update({},{$set:{name:"abc",gender:0}}) {} 匹配全部 只修改第一个
    	
    	  db.stu.update({匹配条件},{$set:{name:"abc"}},{multi:true}) 全部修改
    	
    		db.stu.update({找不到带的匹配条件},{$set:{name:"abc"}},{upsert:true}) 找不到 插入记录
    
    		db.stu.update({匹配条件},{$unset:{"要删除的字段":"任意字符"}})  清除某一字段
    
    	$inc 增加
    		
    		db.stu.update({},{$inc:{"age":1}},{multi:true})  age自增1
    	
    	$push 添加
    
    		db.stu.update({匹配条件},{$push:{"hobby":"read"}})
    		db.stu.update({匹配条件},{$push:{"hobby":{$each:[1,2]}}})
    
    	
    
    	$pop 删除两端
    
    		db.stu.update({匹配条件},{$pop:{"hbooy":-1})
    		db.stu.update({匹配条件},{$pop:{"hbooy":1})
    
    	$pull:按照条件删除元素,:"$pull" 把符合条件的统统删掉,而$pop只能从两端删
    
    		db.stu.update({匹配条件},{$pull:{"hbooy":["read"]})
    
    
    	$addToSet: 避免添加重复:去重 url
    
    		db.urls.insert({"_id":1,"urls":[]})
    		
    		db.urls.update({"_id":1},{"$addToSet":{"urls":'http://www.baidu.com'}})
    		
    		db.urls.update({"_id":1},{"$addToSet":{"urls":{"$each":[
    		            'http://www.baidu.com',
    		            'http://www.baidu.com',
    		            'http://www.xxxx.com']}}})
    		
    	
    
    
    保存:按照 _id 字段
    
      如果一个文档存在的话是 覆盖式的修改,
    
      不存在是添加 insert
    
      db.stu.save({name:"emily",gender:2}) 新增
    
      db.stu.save({_id:"23010132",name:"emily",gender:2}) 有的话覆盖
    
    
    删除:
    
    	1、删除多个中的第一个
    
    		db.user.deleteOne({ 'age': 8 })
    	
    	2、删除国家为China的全部
    
    		db.user.deleteMany( {'addr.country': 'China'} ) 
    	
    	3、删除全部
    
    		db.user.deleteMany({}) 
    	
    	  db.stu.remove({gender:0},{justOne:true}) # 是否只删除一条
    	
    	  db.stu.remove({}) 删除全部
    
     
      size:
    
      db.createCollection("sub",{capped:true,size:10}) # 超过 size大小 会覆盖 capped
    

    数据查询:

    db.sub.find() 查询所有
    db.sub.find().pretty() 查询所有 格式化输出
    db.sub.findOne() 查询第一个

    比较运算符:
    
      < $lt
      <= $lte
      > $gt
      >= $gte
      != $ne
    	= {"条件":"条件"}
    
      		db.sub.find({age:{$gte:18}})
      
    
    逻辑及运算符:
    
      且 , 
    
      或 $or[数组]
    
      		db.sub.find({$or:[{age:{$gte:18}},{gender:0}],name:"alex"})
    
    	非 not
    
      		db.sub.find({age:{$not:{$gte:18}}})
    
    	取余:
    
    		db.sub.stu.find({age:{$mod:[2,1]}}) 除2余1 的age
    
    
    范围运算符:
    
      $in
    
      $nin
    
      		db.sub.find({age:{$in:[18,20]}})
    
    
    支持正则表达式:
    
      使用 正则 表达式
      		db.stu.find({name:{$regex:"^黄.*?[a,e]$"}})
    
    取 指定的 字段
    	
    	db.stu.find({"name":{$regex:"^al"}},{"name":1,"age":1,"_id":0})  只选择查看name age 不要 id
    
    查找数组  {hobby:["tea","music"]}
    
    		db.stu.find({"hobby":"tea"}) 包含tea的全部查找
    		
    		db.stu.find({"hobby.3":"tea"}) 查看第三个 hobby 是 tea的
    
    		db.stu.find({"hobby":{$all:["tea","music"]}})  查看 hobby 既有 tea 又有 music的
    
    		db.stu.find({},{"_id":0,"hobby":{"$slice":[0,3]}})  查找 所有记录的 第一到第三个hobby
    
    	
    
    支持函数
    
      db.stu.find({$where:function(){return this.age>20}})
    
      this 指的是文档对象
    
      mongodb 用的是 js的编辑器
    
     
    
    limit(n) 选择 n 条  显示的个数
    
    skip(m) 跳过m条 
    
      db.sub.find().skip(1).limit(2)
    
    
    投影:只选择某个字段
    
      db.sub.find({},{name:1,gender:0}) # 表示只查看name字段
    
    排序:
    
      db.sub.find().sort({age:-1}) # 1 -1 正序逆序
      db.sub.find().sort({age:-1,"_id":1}) # 先按 age 降序 再按 id正序 
    
    count:计数
    
      db.sub.count({name:{$gte:18}})
      
    distinct:消除重复
    
      db.sub.distinct("gender",{age:{$lte:20}})
    

    2 python api pymongo


    连接方式

    # 1 简写
    client = pymongo.MongoClient()
    
    
    # 2 指定端口和地址
    client = pymongo.MongoClient('localhost',27017)
    
    
    # 3 使用URI 协议
    client = pymongo.MongoClient('mongodb://localhost:27017/')
    

    注意 mongodb 默认内置 连接池:

    在client.close()之后 ,返回连接到连接池
    db.collection.find() --- 还会重新获得连接
    

    (1)插入数据

    	from datetime import datetime 
    	from pymongo import MongoClient
    
    
    	class TestMongo(object):
    
    		def __init__(self):
    			self.client = MongoClient()          # 获取连接
    			self.db = self.client['mongotest']   # 获取db
    
    		def add_one(self): 
    			'''新增数据'''
    
    			post = {
    		 	'title':'newTitle',
    		 	'content':'newContent',
    		 	'create_time':datetime.now()         # 支持 datetime 时间格式
    		}
    
    			return self.db.news.insert_one(post)  # 获取db.table -- insert_one ()  获取数据id ret.inserted_id
    
    			#  插入多条数据  insert_many([{},{},{}])     获取数据id ret.inserted_ids
    
    			# db.table.count() --> 获取数据数量
    
    	def main():
    		obj = TestMongo()
    		ret = obj.add_one()
    		print(ret.inserted_id)
    
    
    	if __name__ == '__main__':
    		main()
    

    (2)查询数据

    def get_one(self):
    	return self.db.news.find_one()             # 获得一个字典结果
    
    def get_more(self):
    	return self.db.news.find({'content':'newContent'})   # 获得有多个值的 迭代器结果
    
    def get_one_from_id(self,object_id):
    
    	from bson.objectid import ObjectId   # 导入 ObjectId 对象类型
    
    	return self.db.news.find_one({'_id':ObjectId(object_id)})   # mongodb中 '_id'对应的是ObjectId对象
    
    
      ret = obj.get_one_from_id('5ab0d07236dc0d164c6e3bc1')
      print(ret)
    

    (3)修改数据

    def update(self):
    	return self.db.news.update_one({'title':'newTitle'},{'$set':{'content':'oldContent'}})    # 修改一条
    
    	return self.db.news.update_many({'title':'newTitle'},{'$set':{'content':'newContent'}})   # 修改多条
    
    
    
    ret = obj.update()
    print(ret.matched_count)  # 匹配到的数据 1  8
    print(ret.modified_count) #完成修改的数据 1  0
    

    (4)删除数据

    def delete(self):
    	return self.db.news.delete_one({'num':1})  # 删除一条
    
    	return self.db.news.delete_many({'num':1})  #删除多条
    
    
    ret = obj.delete()
    print(ret.deleted_count)  # 没有的话 删除值为0
    

    3 MongoEngine 与 ODM


    (1)MongoEngine 的使用:

    安装:
    	pip install mongoengine
    
    连接:
    	
    	from mongoengine import connect
    
    	# 1  简写
    	connect('db')
    
    	# 2  指定端口和地址
    
    	connect('db',host='',port=27017)
    
    	# 3 使用 URI
    
    	connect(
    		db='',
    		username='',
    		password='',
    		host='mongodb://localhost/dbname')
    

    (2)ODM:对象文档 映射

    常见数据类型:

    StringField
    ObjectField
    IntField
    FloatField
    DecimalField
    BooleanField
    DateTimeField
    ListField
    

    基本使用:

    	from mongoengine import connect
    
    	from mongoengine import Document,StringField,IntField,FloatField,ListField,EmbeddedDocument,EmbeddedDocumentField
    
    	# 连接数据库 --- 并没有指定collection
    	connect('mongotest')
    
    
    	SEX_CHOICES = (
    		('male','男'),
    		('female','女')
    		)
    
    
    	# 嵌套的文档类型
    	class Grade(EmbeddedDocument):
    		name = StringField(required=True)
    		score = FloatField(required=True)
    
    		meta = {
    			'collection':'grade'
    		}
    
    
    
                # 静态的文档  --- 若改成 DynamicDocument -- 可以动态添加 模型类中没有定义的字段
    
    	class Student(Document):
    
    		name = StringField(max_length=32,required=True)
    		age = IntField(required=True)
    		address = StringField()
    		sex = StringField(choices=SEX_CHOICES)
    		# 嵌套的文档Field(之前定义过的)
    		grade = ListField(EmbeddedDocumentField(Grade))
    
    		meta = {
    			'collection':'students'               # 指定collection -- students
                                ‘ordering’:['-create_time']        # 按照时间倒序排列
    		 }       	              
    
                         def __str__(self):
    	                return self.name
    
                            # 和ORM一样 定义str方法
    

    添加数据

    	chinese = Grade(
    		name = '语文',
    		score=90)
    	
    	math = Grade(
    		name='数学',
    		score=88)
    
    	student_obj = Student(
    		name = 'egon',
    		age = 18,
    		address = '沙河',
    		sex = 'male',
    		grade=[chinese,math]
    		)
    
               # 如果文档类型定义为DynamicDocument 可以动态添加 模型中没有定义的字段
               # student.phone = 1121321321
    
    	student_obj.save()
    
                print(student_obj.pk) -- >> _id # 获取对象的 pk, id 
    


    查询数据

        单条数据:
    
    	student_obj = Student.objects.first()
    
    	print(student_obj)      #  Student object
    	print(student_obj.name)        # alex
    
        多条数据:
                
                student_obj = Student.objects.all()
    
                print(student_obj)           # [<Student: alex>, <Student: egon>]
    
        按条件筛选:
    
            student_obj = Student.objects.filter(pk='5ab0f05136dc0d3358bde887').first()
    
                            gradeList = student_obj.grade
    
                            for grade in gradeList:
                                print(grade.score)   #  90,80
    
            print(Student.objects.filter(age__gt=18))     # 年龄大于18的 -- 和ORM简直一样
    

    修改数据

            Student.objects.filter(name='alex').update(age=40)        # 修改多条
        
            Student.objects.filter(name='alex').update_one(age=40)        # 修改一条
    

    删除数据

                    Student.objects.filter('_id'='awewdsad21321').first().delete()    #删除一条
    
                    Student.objects.filter(age__gt=18).delete()                 # 删除多条
    

    参考文档 http://docs.mongoengine.org/projects/flask-mongoengine/en/latest/

  • 相关阅读:
    Row_Number 分页
    获取分组前5条数据
    sqlserver数据库学习
    改变电脑背景颜色保护视力
    问题集锦
    修改sqlserver自动编号的当前列值
    datatable数据批量倒入数据库
    sqlserver case
    空连接的写法
    遍历日志文件并打印
  • 原文地址:https://www.cnblogs.com/big-handsome-guy/p/8610355.html
Copyright © 2011-2022 走看看