【Mongodb】MongoDB

版权声明:相互学习,一起成长,转载请联系博主。 https://blog.csdn.net/sunyaowu315/article/details/88592938


【博客地址】: https://blog.csdn.net/sunyaowu315
【博客大纲地址】: https://blog.csdn.net/sunyaowu315/article/details/82905347


一 Mongodb介绍及用途

MongoDB 属于文档型非关系型数据库,开源、高性能、高可用、可扩展。
MongoDB 介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

特点:
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:

  • 面向集合存储,易存储对象类型的数据
  • 模式自由
  • 支持动态查询
  • 支持完全索引,包含内部对象
  • 支持查询
  • 支持复制和故障恢复
  • 使用高效的二进制数据存储,包括大型对象(如视频等)
  • 自动处理碎片,以支持云计算层次的扩展性
  • 支持RUBY,PYTHON,JAVA,C ,PHP,C#等多种语言
  • 文件存储格式为BSON(一种JSON的扩展)
  • 可通过网络访问

二 安装说明

下载链接: https://pan.baidu.com/s/1J5wy0XewZaBB6DRrzCXG0g 提取码: fm8b ,点击安装64位的

参考操作方法http://www.ddooo.com/softdown/130308.htm#dltab


三 如何高效使用mongoDB

MongoDB中的三个概念:

数据库(database): 一个仓库,在其中可以存放集合。

集合(collection): 概念相当于MySQL中的表,类似于一个数组,在集合中可以存放文档。

文档(document): 文档是数据库中的最小单位,我们存储和操作的内容都是文档。

注意:在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在会自动创建数据库和集合。
在这里插入图片描述

1、库操作

基本指令

show dbs/databases: // 查看所有数据库 
use (database):     // 进入到指定的数据库中
db                  // 显示当前窗口所处的数据库
db.stats()          // 查看当前数据库状态
db.dropDatabase()   // 删除当前数据库,默认为 test,故要切换到某个数据库下进行删除
use myNewDB         // 创建数据库
db.myNewCollection1.insertOne({ x: 1 }) //第一次对该数据库存储数据时,自动创建
db.myNewCollection3.createIndex( { y: 1 } )
db.createCollection('数据库名',options)// 显性创建collection
show collections    // 查看所有collection
db.gather_A.drop()  //删除collection

2、集合操作-CRUD(增删改查)

Field 的顺序和限制
1、_id总是document中的第一个字段
2、更新其他字段内容也会导致字段的顺序变化
3、_id这个名称是保留给主键的,这个值在一个collection中必须唯一且不变,可以是除开array以外的任意类型
4、字段名不能以$开头
5、字段名不能包含.
6、字段名不能包含空字符

基本指令

db.createCollection("gather_A")
db.createCollection("collectionName",{capped:true,size:10000,max:100});//size指定集合大小,单位为KB,max指定文档数量
db.gather_A.count();//统计集合gather_A中的数据数量
#注:mongo中支持js,可通过js操作实现批零处理,如:for(var i=0;i<1000;i++)
{db.gather_A.insert({name:"xiaomu"+i,age:20+i});}

插入: db.<collection>.insert(doc)

db.gather_A.insert({name:'Tom', age:18, gender:'male'})
db.gather_A.insert([{name:'Jerry', age:18, gender:'male'},{name:'Herry',age:20,gender:'female'}])
#如果插入时没有给文档指定_id属性,则数据库会自动为文档添加_id属性(ObjectId),相关方法:
db.<collection>.insertOne() # 插入一个文档对象
db.<collection>.insertMany()# 插入多个文档对象

查询:db.<collection>.find()

#查询集合中的所有文档,返回的是一个数组。
db.gather_A.find()

#可以接收一个对象作为条件参数,表示查询符合条件的文档,{}表示查询所有。
db.gather_A.find({age:20})

#支持通过内嵌文档的属性进行查询,通过.来匹配,注意属性名必须加引号!
db.gather_A.find({'hobby.movies':'comedy'})
#并不是说属性值一定要等于该值,如果属性值是一个数组,只要数组中包含该值即可!相关方法:

db.<collection>.findOne() # 查询集合中符合条件的第一个文档,返回的是一个文档对象。
db.<collection>.find({}).count() # 查询集合中符合条件的文档的数量,返回一个数值。
db.<collection>.find({}).limit(10) # 设置返回查询的数据的上限。
db.<collection>.find({}).skip(10).limit(10) # 返回第11条到第20条数据。
db.<collection>.find({}).sort({num:1, age:-1}) # 传递一个对象来指定排序规则,1表示升序,-1表示降序,MongoDB会自动调整sort、skip和limit的位置,谁写前谁写后并无大碍。

#distinct()对数据进行去重: 
db.gather_A.distinct('class',{age:{$gt:18}})# 查找年龄大于18的人的班级(去重)

#投影
#在做查询时,可以在第二个参数设置查询结果的投影,1表示显示,0表示不显示。
db.<collection>.find({}, {name:1}) # 显示该集合文档的name字段和id字段(id默认显示)。

#运算关系
$gt、$lt、gte、lte
#gt(greater than)大于;lt(less than)小于;gte(greater then equal)大于等于;lte(less than equal)小于等于;ne(not equal)不等于
db.gather_A.find({num:{$gt:20, $lt:30}}) # 返回num值大于20小于30的文档。
#$or表示或,只要满足数组其中一个条件即可:
db.gather_A.find({$or:[{num:{$lt:100}}, {num:{$gt:200}}]}) # 返回num值小于100或者大于200的文档。

#包含关系
db.collection1.find({price:{$all:[1,2]}});//(包含。。并且包含。。)此处price是个数组,此方法查询所有price包含1和2的数据
db.collection1.find({price:{$in:[1,2]}});//(包含。。或者包含。。)查询price中含有1或者2的数据
db.collection1.find({price:{$nin:[1,2]}});//(不包含。。并且不包含。。)查询price中不含有1并且不含有2的数据
db.collection1.find({$or:[{name:"xiaomu"},{price:{$in:[3]}}]});//(。。或者。。)查询name为xiaomu或者价格包含3的数据
db.collection1.find({$nor:[{name:"xiaomu"},{name:"xiaoli"}]});//(既不也不)查询name不为xiaomu或者name不为xiaoli的数据

#分页
db.collection1.find().skip(0).limit(10);//查询从0条开始,查询10条,skip()方法默认参数为 0 ,表示跳过的条数

#排序
db.collection1.find().sort({age:1});//按照年龄升序排序,为-1的话表示降序排序

#存在
db.gather_A.find({hight:{$exists:1}})//查询存在hight字段的数据

更新:db.<collection>.update({查询条件},{新对象},{options})

update命令格式:

db.collection.update(criteria,objNew,upsert,multi)

参数说明:

criteria: 查询条件

objNew: update对象和一些更新操作符

upsert: 如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。

multi: 默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。

#默认情况下会使用新对象来替换旧的对象。
#如果需要修改指定的属性而不是替换,需要使用修改操作符来完成修改
$set #可以用来增加或修改文档中的指定属性
db.gather_A.update({"_id":1}, {$set:{age:22,address:'China'}})
$unset #可以用来删除文档中的指定属性
db.gather_A.update({"_id":1}, {$unset:{address:'这里是什么不重要,反正要删除'}})
update()#默认情况下只改变一个,如果需要同时修改多个,增加第三个配置参数{multi:true},或者使用updateMany()。
#如果属性是一个数组,需要往数组中加入新的元素,则可以使用操作符$push:
db.gather_A.update({username:'Tom'},{$push:{'hobby.movies':'Mr Bean'}})
$each#可以对数组进行解构:{$push: {a: {$each: [1,2]}}} —— 向数组a中加入1和2。
$addToSet#操作符也可向数组中添加一个新元素,与$push的区别是,不允许添加重复的元素。
#使用操作符$pop从数组中移除一个元素,1代表最后一个元素,-1代表第一个元素:
{$pop: {a: 1}} # 从数组a中移除最后一个元素
{$pop: {a: -1}} # 从数组a中移除第一个元素
#使用操作符$pull从数组中移除所有的指定元素:
{$pull: {a: 5}} # 移除数组a中所有值为5的元素。
#使用操作符$pullAll来移除所有的多个指定元素:
{$pullAll: {a: [5, 6]}} # 移除数组a中所有值为5或6的元素。
#让属性值在原有基础上自增,使用操作符$inc:
db.gather_A.updateMany({num:{$lt:1000}}, {$inc:{num:400}}) # 让所有num小于1000的文档num值增加400
#相关方法:
db.<collection>.updateOne() #修改一个符合条件的文档
db.<collection>.updateMany() # 修改多个符合条件的文档
db.<collection>.replaceOne() # 替换一个文档中的某些属性
db.collection.update() when used with the upsert: true option.
db.collection.updateOne() when used with the upsert: true option.
db.collection.updateMany() when used with the upsert: true option.
db.collection.findAndModify() when used with the upsert: true option.
db.collection.findOneAndUpdate() when used with the upsert: true option.
db.collection.findOneAndReplace() when used with the upsert: true option.
db.collection.save().
db.collection.bulkWrite().
#1,$inc增加值
db.test.update({'id':2},{'$inc':{'id':2}}) 其中后面两个双引号是必须的
db.test.update({'id':6},{$inc:{id:2}}) 在mongodb交互环境中这么来写
#2,$set设置字段值
db.test.update({'id':6},{'$set':{'id':2}})
db.test.update({'id':6},{$set:{id:2}})  
#3,$unset删除某字段
db.test.update({'id':6},{'$unset':{'id':6}})
db.test.update({'id':6},{$unset:{id:6}})
#4,$rename重命名某字段
db.test.update({'id':1},{'$rename':{'id':'userid'}})
db.test.update({id:10},{$rename:{id:'userid'}})

删除:db.<collection>.remove({},Boolean)

remove()#必须传入参数,可以根据条件对象来删除文档,传递条件的方式和find()一样,默认情况下会同时删除多个,相当于deleteMany()。
#如果传入第二个参数为true,则只会删除一个,相当于deleteOne()。
#如果传入第一个参数对象为{},则会清空所有的文档,相当于删除集合,但是性能比较差,不如用db.<collection>.drop()。
#相关方法:
db.<collection>.deleteOne() # 删除一个
db.<collection>.deleteMany() # 删除多个
db.<collection>.drop() # 删除集合
#一般在实际生产中,数据不会真正地删除,而是做逻辑删除。比如给集合中的每个文档增加一个数据字段isDel,设置值为1,标记为删除。

四 python连接MongoDB

#导入包
import pymongo
#创建pymongo库调用函数
def Mongo_connect(dbname, base):
    dbs = pymongo.MongoClient('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 27017)#库
    # 连接mydb数据库,账号密码认证
    db = dbs[dbname]
    db.authenticate("xxx", "xxxxxxxxxxxxxxxxxx")#账号+密码
    # 连接表
    collection = db[base]
    dbs.close()
    return collection   
#实例应用
connect = Mongo_connect(dbname='data_base', base='gather_A')
find1 = connect.find().skip(10).limit(10)

猜你喜欢

转载自blog.csdn.net/sunyaowu315/article/details/88592938