一.mongodb简介

  MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
  MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构
非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类
似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。  特点:高性能、易部署、易使用,存储数据非常方便。

二.常见的增删改查操作

  2.1库操作

1.创建库(也是切换库,当没有这个库就创建这个库)  

> use local
switched to db local

2.查看所有库

> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB

3.查看当前库

> db
local

4.查看库状态

l> db.stats()

{
"db" : "dajiba",
"collections" : 1,
"views" : 0,
"objects" : 1,
"avgObjSize" : 36,
"dataSize" : 36,
"storageSize" : 16384,
"numExtents" : 0,
"indexes" : 1,
"indexSize" : 16384,
"fsUsedSize" : 18738225152,
"fsTotalSize" : 64428584960,
"ok" : 1
}

5.刚创建的库没有信息不会在库列表显示,库有信息才有显示

库插入:db.表名/集合名.inset({bson格式数据})

> db.dajiba.insert({'name':'tom'})
WriteResult({ "nInserted" : 1 })

6.查看库中的表/集合

show tables

show collections

> show tables
dajiba
> show collections
dajiba

7.删库跑路(删除的是当前库)

> db.dropDatabase()
{ "dropped" : "dajiba", "ok" : 1 }

  

  2.2集合操作

1.创建库
> use blog
switched to db blog 2.往库中的article这个表/集合插入数据(会帮你帮article这个表/集合创建好)
> db.article.insert({"title":"python"})
WriteResult({ "nInserted" : 1 })
> db.article.insert({"title":"linux"})
WriteResult({ "nInserted" : 1 })
3.查看所有的表/集合
> show tables;
article 4.删处集合/表
> db.article.drop()
true
> show tables;
> 5.查看表中所有的数据
  db.表名/集合名.find()
  db.数据表.findOne() //查询数据表的第一条数据
 

  2.3文档操作指令

   2.3.1 插入文档   

#没有指定_id则默认ObjectId,_id不能重复,且在插入后不可变,一般都不指定
(1)插入单条
  db.表名.insert({'name':'sb'})
(2)插入多条
  user1={'name':'a'}
  user2={'name':'b'}
  user3={'name':'c'}
  db.集合名.insertMany([user1,user2.user3])
插入数据最好把数据放在一个列表中,一次性插入,速度会比较快,减少频繁的读写

      2.3.2 查看文档

###################### (1) 比较运算  ###################################

# SQL:=,!=,>,<,>=,<=
# MongoDB:{key:value}代表什么等于什么,
#条件":
  $ne":不等于,
  "$gt":大于,
  "$lt":小于,
  "gte":大于等于,
  "lte":小于等于,
  其中"$ne"能用于所有数据类型 #1、select * from db1.user where name = "alex";
  db.user.find({'name':'alex'}) #2、select * from db1.user where name != "alex";
  db.user.find({'name':{"$ne":'alex'}}) #3、select * from db1.user where id > 2;
  db.user.find({'_id':{'$gt':2}}) #4、select * from db1.user where id < 3;
  db.user.find({'_id':{'$lt':3}}) #5、select * from db1.user where id >= 2;
  db.user.find({"_id":{"$gte":2,}}) #6、select * from db1.user where id <= 2;
  db.user.find({"_id":{"$lte":2}}) ###################### (2) 逻辑运算 ###################################
# SQL:and,or,not
# MongoDB:字典中逗号分隔的多个条件是and关系,"$or"的条件放到[]内,"$not" #1、select * from db1.user where id >= 2 and id < 4;
  db.user.find({'_id':{"$gte":2,"$lt":4}}) #2、select * from db1.user where id >= 2 and age < 40;
  db.user.find({"_id":{"$gte":2},"age":{"$lt":40}}) #3、select * from db1.user where id >= 5 or name = "alex";
  db.user.find({ "$or":[ {'_id':{"$gte":5}}, {"name":"alex"} ] }) #4、select * from db1.user where id % 2=1;
  db.user.find({'_id':{"$mod":[2,1]}}) #5、上题,取反
  db.user.find({'_id':{"$not":{"$mod":[2,1]}}}) ###################### (3) 成员运算 ###################################
# SQL:in,not in
# MongoDB:"$in","$nin"
#1、select * from db1.user where age in (20,30,31);
  db.user.find({"age":{"$in":[20,30,31]}})
#2、select * from db1.user where name not in ('alex','yuanhao');
  db.user.find({"name":{"$nin":['alex','yuanhao']}}) ###################### (4) 正则匹配 ################################### # SQL: regexp 正则
# MongoDB: /正则表达/i #1、select * from db1.user where name regexp '^j.*?(g|n)$';
  db.user.find({'name':/^j.*?(g|n)$/i}) ###################### (5) 取指定字段 ###################################
#1、select name,age from db1.user where id=3;
  db.user.find({'_id':3},{''name':1,'age':1}) #2 db.user.find({'_id':3},{"addr":0})
  { "_id" : 3, "name" : "yuanhao", "age" : 30, "hobbies" : [ "music", "drink" ] } ###################### (6) 查询数组 ###################################
#1、查看有dancing爱好的人
  db.user.find({'hobbies':'dancing'})
#2、查看既有dancing爱好又有tea爱好的人
  db.user.find({ 'hobbies':{ "$all":['dancing','tea'] } })
#3、查看第4个爱好为tea的人
  db.user.find({"hobbies.3":'tea'})
#4、查看所有人最后两个爱好
  db.user.find({},{'hobbies':{"$slice":-2},"age":0,"_id":0,"name":0,"addr":0})
#5、查看所有人的第2个到第3个爱好
  db.user.find({},{'hobbies':{"$slice":[1,2]},"age":0,"_id":0,"name":0,"addr":0}) ###################### (7) 排序 ###################################
# 排序:--1代表升序,-1代表降序 db.user.find().sort({"name":1,}) db.user.find().sort({"age":-1,'_id':1}) ###################### (8) 分页 ###################################
# 分页:--limit代表取多少个document,skip代表跳过前多少个document。 db.user.find().sort({'age':1}).limit(1).skip(2) ###################### (9) 查询数量 ###################################
# 获取数量
db.user.count({'age':{"$gt":30}}) 
--或者 db.user.find({'age':{"$gt":30}}).count() ###################### (10) 其它 ###################################
#1、{'key':null} 匹配key的值为null或者没有这个key
db.t2.insert({'a':10,'b':111})
db.t2.insert({'a':20})
db.t2.insert({'b':null}) > db.t2.find({"b":null})
{ "_id" : ObjectId("5a5cc2a7c1b4645aad959e5a"), "a" : 20 }
{ "_id" : ObjectId("5a5cc2a8c1b4645aad959e5b"), "b" : null } #2、查找所有 db.user.find()
#等同于db.user.find({})
  db.user.find().pretty() #3、查找一个,与find用法一致,只是只取匹配成功的第一个
  db.user.findOne({"_id":{"$gt":3}}) 

    2.3.3修改文档

############################## 1 update的语法 ##############################

update() 方法用于更新已存在的文档。
语法格式如下: db.collection.update(
      <query>, <update>,
       {
       upsert: <boolean>,
       multi: <boolean>,
       writeConcern: <document> } )
参数说明:对比update db1.t1 set name='EGON',sex='Male' where name='egon' and age=18
query : 相当于where条件。
update : update的对象和一些更新的操作符(如$,$inc...等,相当于set后面的
upsert : 可选,默认为false,代表如果不存在update的记录不更新也不插入,设置为true代表插入。
multi : 可选,默认为false,代表只更新找到的第一条记录,设为true,代表更新找到的全部记录。 writeConcern :可选,抛出异常的级别。 更新操作是不可分割的:若两个更新同时发送,先到达服务器的先执行,然后执行另外一个,不会破坏文档。 ############################## 2 覆盖更新 ##############################
#注意:除非是删除,否则_id是始终不会变的
#1 : db.user.update({'age':20},{"name":"Wxx","hobbies_count":3}) 是用{"_id":2,"name":"Wxx","hobbies_count":3}覆盖原来的记录 #2、一种最简单的更新就是用一个新的文档完全替换匹配的文档。这适用于大规模式迁移的情况。
例如
var obj=db.user.findOne({"_id":2}) obj.username=obj.name+'SB'
obj.hobbies_count++ delete obj.age
obj.age db.user.update({"_id":2},obj) db.user.update({"_id":2},obj) ############################## 3 局部更新 ##############################
#设置:$set 通常文档只会有一部分需要更新。可以使用原子性的更新修改器,指定对文档中的某些字段进行更新。
更新修改器是种特殊的键,用来指定复杂的更新操作,比如修改、增加后者删除
#1、update db1.user set name="WXX"
  where id = 2 db.user.update({'_id':2},{"$set":{"name":"WXX",}}) #2、没有匹配成功则新增一条{"upsert":true}
  db.user.update({'_id':6},{"$set":{"name":"egon","age":18}},{"upsert":true}) #3、默认只改匹配成功的第一条,{"multi":改多条}
  db.user.update({'_id':{"$gt":4}},{"$set":{"age":28}})
  db.user.update({'_id':{"$gt":4}},{"$set":{"age":38}},{"multi":true}) #4、修改内嵌文档,把名字为alex的人所在的地址国家改成Japan
  db.user.update({'name':"alex"},{"$set":{"addr.country":"Japan"}}) #5、把名字为alex的人的地2个爱好改成piao db.user.update({'name':"alex"},{"$set":{"hobbies.1":"piao"}}) #6、删除alex的爱好,$unset db.user.update({'name':"alex"},{"$unset":{"hobbies":""}}) ############################## 4 自增或自减 ##############################
#增加和减少:$inc
#1、所有人年龄增加一岁
  db.user.update({}, { "$inc":{"age":1} }, { "multi":true } ) #2、所有人年龄减少5岁
  db.user.update({}, { "$inc":{"age":-5} }, { "multi":true } ) ############################## 5 添加删除数组内元素 ##############################
#添加删除数组内元素:$push,$pop,$pull
往数组内添加元素:$push
#1、为名字为yuanhao的人添加一个爱好
  read db.user.update({"name":"yuanhao"},{"$push":{"hobbies":"read"}}) #2、为名字为yuanhao的人一次添加多个爱好tea,dancing
  db.user.update({"name":"yuanhao"},{"$push":{ "hobbies":{"$each":["tea","dancing"]} }}) 按照位置且只能从开头或结尾删除元素:$pop
#3、{"$pop":{"key":1}} 从数组末尾删除一个元素
db.user.update({"name":"yuanhao"},{"$pop":{ "hobbies":1} }) #4、{"$pop":{"key":-1}} 从头部删除
  db.user.update({"name":"yuanhao"},{"$pop":{ "hobbies":-1} }) #5、按照条件删除元素,:"$pull" 把符合条件的统统删掉,而$pop只能从两端删
  db.user.update({'addr.country':"China"},{"$pull":{ "hobbies":"read"} }, { "multi":true } ) ############################## 6 避免重复添加 ##############################
#避免添加重复:"$addToSet" db.urls.insert({"_id":1,"urls":[]})
db.urls.update({"_id":1},{"$addToSet":{"urls":'http://www.baidu.com'}})
db.urls.update({"_id":1},{"$addToSet":{"urls":'http://www.baidu.com'}})
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' ] } } } ) ############################## 7 其它 ##############################
#1、了解:限制大小"$slice",只留最后n个
  db.user.update({"_id":5},{ "$push":{"hobbies":{ "$each":["read",'music','dancing'], "$slice":-2 } } }) #2、了解:排序The $sort element value must be either 1 or -1"
   db.user.update({"_id":5},{ "$push":{"hobbies":{ "$each":["read",'music','dancing'], "$slice":-1, "$sort":-1 } } })
#注意:不能只将"$slice"或者"$sort"与"$push"配合使用,且必须使用"$each"  

   2.3.4删除

#1、删除多个中的第一个
db.user.deleteOne({ 'age': 8 }) #2、删除国家为China的全部
db.user.deleteMany( {'addr.country': 'China'} ) #3、删除全部
db.user.deleteMany({})

3.pymongo

    

1.python与mongo不通用的操作

名称 python mongo    
空值 None null    
布尔值 True/False true/false    
         

sort方法:

 在MongoDB中, sort()命令接收一个参数, 这个参数是一个字典, Key是被排序的字段名, 值
为1或者−1

在Python中, sort()方法接收两个参数: 第1个参数为字段名, 第2个
参数为-1或者1。 写成如图3-69所示样子就能够正常运行。

2.pymongo最基本的操作

# 1.查
collection.find({},{'_id':0}) #返回整个集合所有集合的迭代器,需要for循环取值
collection.find_one({'name':'xiaosan'}) #返回查询的单条数据,不需要再取值
#find不论有没有结果返回的都是游标对象,find_one有结果就是那条数据,没有结果就是None # 2.增
1.insert #不推荐使用,但可以使用
insert()
result = collection.insert([student1, student2])
print(result)
#返回值为插入文档的对应的_id的集合
#[ObjectId('5932a80115c2606a59e8a048'), ObjectId('5932a80115c2606a59e8a049')] 2.insert_one #插入单条数据,字典
result=collection.insert_one()
print(result) #<pymongo.results.InsertOneResult object at 0x10d68b558>
print(result.inserted_id) #5932ab0f15c2606f0c1cf6c5 3.insert_many() #插入多条数据,列表套字典
result = collection.insert_many([student1, student2])
print(result) #<pymongo.results.InsertManyResult object at 0x101dea558>
print(result.inserted_ids) #[ObjectId('5932abf415c2607083d3b2ac'),ObjectId('5932abf415c2607083d3b2ad')] #3.改 注意update不能使用$set
1. updata #不推荐使用,但是可以使用
condition={'name':'xiaosna'}
row=collection.find(condition)
row['age']=18
result=collection.update(condition,row) #{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}
#这里我们要更新数据的年龄:首先指定查询条件,然后将数据查询出来,
#修改年龄后调用update()方法将原条件和修改后的数据传入。
#这种方式其实就是用新的文档row,把原来的文档整个替换掉
2.update_one
# $set的使用 局部更新
condition = {'name': 'Kevin'}
student = collection.find_one(condition)
student['age'] = 26
result = collection.update_one(condition, {'$set': student})
print(result) #<pymongo.results.UpdateResult object at 0x10d17b678>
print(result.matched_count, result.modified_count) #1 0
#上面的操作其实就是把文档的age改成26,属于局部更新      result = collection.update_one(condition, {'$set':{'place':{'china'}}})
     #这种方式也是一样的,当查询的结果有place字段,则place的值更新为china,当place字段不存在,则在查询的结果增加这么一个字段,其他字段不改变
#所以说,用$set无论你是完整的文档吧值更新后传进去update——one,或者只传要更新的字段,都属于局部更新
#可以查询多条数据,却值更新第一条数据
condition = {'age': {'$gt': 20}}
result = collection.update_one(condition, {'$inc': {'age': 1}})
print(result) #<pymongo.results.UpdateResult object at 0x10b8874c8>
print(result.matched_count, result.modified_count) #1 1
3.update_many()
condition = {'age': {'$gt': 20}}
result = collection.update_many(condition, {'$inc': {'age': 1}})
print(result) #<pymongo.results.UpdateResult object at 0x10c6384c8>
print(result.matched_count, result.modified_count) #3 3
  
    4.update_many()  #upsert的使用,可以在在这条数据不存在的时候进行插入这条数据(没有加这个参数,对一条不存在的数据进行更新会报错)
condition = {'age': {'$gt': 20}}
result = collection.update_many(condition, {'$inc': {'age': 1}})
print(result) #<pymongo.results.UpdateResult object at 0x10c6384c8>
print(result.matched_count, result.modified_count) #3 3

#4.删
1.remove
result = collection.remove({'name': 'Kevin'})
print(result) #{'ok': 1, 'n': 1}
2.delete_one()
result = collection.delete_one({'name': 'Kevin'})
print(result) #<pymongo.results.DeleteResult object at 0x10e6ba4c8>
print(result.deleted_count) #
3.delete_many
result = collection.delete_many({'age': {'$lt': 25}})
print(result.deleted_count) #
   4.# 删除指定字段
      condition = {'age': {'$gt': 20}}
      collection.update(k , {'$unset': {'需删除的字段': 1}}, false, true)
#5.索引的创建
collection.create_index([('url':1)]) #单字段索引
collection.create_index([('id':1)]) #单字段索引
collection。create_index('title') #默认的 collection.create_index([('url':1),('subname':1)]) #符合索引
#修改年龄后调用update()方法将原条件和修改后的数据传入。

mongodb的初步使用的更多相关文章

  1. mongoDB学习初步总结

    What? 最受欢迎的非关系型数据库之一.面向文档的数据库,在存储乎数据方面与关系型数据库有着本质的区别. Why? 简单易用 对多变的业务需求,适应性强于SQL型DB 性能 复制 索引 分片 丰富的 ...

  2. MongoDB使用初步

    我很快就要离开现在这个使用nodejs + mongodb + redis的项目,转而去搞 塞特ID 之类的别的项目了.可惜这些技术对我来说浅尝辄止,半生不熟,胎死腹中.业余时间自学当然也可以,但哪有 ...

  3. MongoDB入门,安装配置与基本CURD操作

    MongoDB特点 MongoDB是NoSQL的一种,非关系型数据库,或者叫不只是关系型数据库(Not Only SQL).MongoDB采用json格式的文档存储,与Redis的key-value有 ...

  4. 使用Requests+正则表达式爬取猫眼TOP100电影并保存到文件或MongoDB,并下载图片

    需要着重学习的地方:(1)爬取分页数据时,url链接的构建(2)保存json格式数据到文件,中文显示问题(3)线程池的使用(4)正则表达式的写法(5)根据图片url链接下载图片并保存(6)MongoD ...

  5. 初步认识mongodb文件

    初步认识mongo. README文件介绍压缩包中各个文件的功能. bin/mongod - MongoDB server bin/mongo - MongoDB client bin/mongodu ...

  6. NoSql非关系型数据库之MongoDB应用(三):MongoDB在项目中的初步应用

    业精于勤,荒于嬉:行成于思,毁于随. 我们可以结合相关的IDE做一个简单的增删改查了,实现MongoDB在项目中的初步应用. 前提是安装了MongoDB服务和MongoDB可视化工具,没有安装的可以点 ...

  7. MongoDB与PostgresQL无责任初步测试

    PostgresQL一秒能插入多少条记录,MongoDB呢?读取的情况又如何?我写了一些简单的程序,得出了一些简单的数据,贴在这里分享,继续往下阅读前请注意下本文标题中的“无责任”,这表示此测试结果不 ...

  8. mongodb初步使用

    下载安装: 下载MongoDB:http://www.mongodb.org/. 安装MongoDB:傻瓜式安装 配置: 把bin目录添加到系统环境变量 启动: 打开一个 cmd编辑框,输入: mon ...

  9. mongodb初步使用体验

    前言 Mongodb是一个非常有名的缓存数据库,和它名气相当的还有redis和hbase.笔者之前使用过redis,memcache和elasticsearch,借着工作机会,正好可以好好学习一下mo ...

随机推荐

  1. 写一段php代码,确保报个进程同时写入同一个文件

  2. 4、MemorySubSystem

    1.概述 S3C6410X存储器子系统包括7个存储器控制器,SROM控制器,两个OneNAND控制器,一个NAND Flash控制器,一个CF控制器,一个DRAM控制器.静态存储器控制器,oneNAN ...

  3. mysql 游标CURSOR

    FETCH cursor_works INTO num,provinceIDs,cityIDs,SourceID; 定义的变量值必须与 游标中的字段不同,一一对应 DECLARE cursor_wor ...

  4. 20145218张晓涵 PC平台逆向破解_advanced

    ---恢复内容开始--- 20145218张晓涵 PC平台逆向破解_advanced shellcode注入 基础知识 shellcode就是在利用溢出攻击溢出时要值入的代码,也就是溢出后去执行的代码 ...

  5. EasyUI控件combobox重复请求后台,dialog窗口数据异常

    最近在用Easy UI+Dapper+MVC4 开发一个财务收款系统,其中就发现一些小问题,供有需要的人参考. 1.EasyUI控件combobox 数据绑定 出现重复请求后台 上代码: <td ...

  6. C#设计模式系列:适配器模式(Adapter Pattern)

    一.引言 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用.但是新环境要求的接口是这些现存对象所不满足的.如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同 ...

  7. MSSQL中数据库对象类型解释

    public string GetObjectTypeName(object oType) { switch (oType+"") { case "U": re ...

  8. 【spring源码】bean的实例化(转载)

    首先来看一段代码,看过上一节的朋友肯定对这段代码并不陌生.这一段代码诠释了Spring加载bean的完整过程,包括读取配置文件,扫描包,加载类,实例化bean,注入bean属性依赖. 上一节介绍了Sp ...

  9. Communication with each role instance in Azure

    Use WCF  Communication with role instance in azure 1)In worker role build WCF Service public overrid ...

  10. 微信支付的SDK曝出重大漏洞(XXE漏洞)

    一.背景 昨天(2018-07-04)微信支付的SDK曝出重大漏洞(XXE漏洞),通过该漏洞,攻击者可以获取服务器中目录结构.文件内容,如代码.各种私钥等.获取这些信息以后,攻击者便可以为所欲为,其中 ...