3_3_mongodb 的简单使用。

本文介绍了MongoDB的基本操作,包括使用pymongo进行命令行操作,如插入、查询、更新和删除数据。通过实例展示了find、update_one、delete_one和delete_many等核心命令,以及如何在实际项目中进行数据处理和维护。
摘要由CSDN通过智能技术生成


mongodb菜鸟教程

mongo官方文档-英文


本人 mongodb 用的比较少 水平就在那里。
简单的一些查询 大家可以收藏。 更深入的可以自行 在学会基础操作之后。 再 去学习官方的文档或者,一些视频学习。


可视化软件

  1. MongoDB Compass Community(官方文档那个网站中有)
  2. 将mongodb制作为服务(菜鸟教程中有)

MongoDB概念介绍

mysql是关系型数据库,有关联,需要按照字段存储
存储海量数据会比较麻烦.

MongoDB是一个分布式文件存储的数据库,可以没有关联.
处理海量数据比较方便,更有优势,数据少当然也可以使用的.

SQL与MongoDB对比

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
joinsjoins表连接/MOngoDB不支持
primary keyprimary key主键/MongoDB自动将_id字段设置为主键

MongoDB三元素:

三元素:数据库,集合,文档.

  1. 文档(document):
     就是关系型数据库中的一行. 文档是一个对象 ,由键值组成,是Json的扩展形式

      {‘name’:‘abc’,‘gender’:‘1’}

  2. 集合(collection):
     就是关系型数据库中的表.可以存储多个文档,结构可以不固定.如可以
    存储如下文档在一个集合中(monggo给我的感觉就是js 的 object对象。 数组等。然后操作函数也很有 js 的风格。)

{'bname':'abc','gender':'1'}
{'name':'xxx','age':18}
{'title':'yyy','price':20.9}

基本操作命令

  1. db:查看当前的数据库
  2. show dbs:查看所有的数据库
  3. use 数据库名:切换数据库,如果数据库不存在,则创建一个数据库
  4. db.dropDatabase():删除当前指向的数据库
  5. db.集合名.insert(value) :添加数据到指定的集合中
  6. db.集合名.find() :从指定的集合中查找数据

    更多命令查看:runoob学习网站

pymongo使用

import pymongo
# 第一步安装和 导入pymongo
# 获取   mongo连接的  mongodb的对象
client = pymongo.MongoClient("127.0.0.1", port=27017)
# 获取数据库
db = client.zhihu
# 获取数据库中的集合,
# 也就是mysql中的表,   如果没有这个 集合 ,会在内存中创建,等待我们插入数据之后 就会 在数据库中生成
collection = db.qa
# 写入数据,也就是文档 到 集合中
collection.insert({'qquser': '9433208989', 'password': '74110'})

# ################# 插入数据 #######

# ########## insert_one ################
# 插入一条数据等于insert 一样的效果 ,相当于简写

# ########## insert_many ################
# 这里要用列表包起来    不然会报错
collection.insert_many([{
     'litao_qq': '909090', 'litao_qq_mm': '7888881'
 }, {'litao_qq': '909090', 'litao_qq_mm': '7888881'}])

# ################# 查询数据 #############

# 1 find 方法 : 获取集合中所有的数据
cursor = collection.find()  # 返回一个游标对象
 for x in cursor:
     print(x)

# 2 获取集合中的一条数据
result = collection.find_one()  # 查找第一条数据
result = collection.find_one({'cnm': '回家养猪'})  # 设定条件 去查询 文档也就是MySQL的一行
print(result)

# ########### 更新数据 ###########

# 更新一条数据
collection.update_one(
     {'litao_qq': '909090'},
     {
         '$set': {'litao_qq': 'ccc'}
     }
 )  # 前面是条件 ,后面是设置

# 更新多条数据
 collection.update_many({'litao_qq': '909090'}, {
                        '$set': {'litao_qq_mm': '99999999999999999'}
                        })

# ################ 删除数据 ##############

# 删除多条数据
collection.delete_one({'litao_qq': "99999999999999999"})  # 删除一条数据,.也就是一个文档

# 删除多条数据
collection.delete_many({
    'litao_qq': "99999999999999999",
    "cnm": "回家养猪"
})  # litao_qq  符合的文档全部删除

命令行操作mongodb

mongodbshell 完全支持 Javascript 可以直接在里面定义函数。运行函数都是可以的。

其实懂 js 语法就很简单了。 然后找一些 接口文档 看看 熟练一下。 日常使用就没问题了。

然后 python 的接口实现 我看了 下 大多还是

查看帮助


> help
        db.help()                    help on db methods
        db.mycoll.help()             help on collection methods
        sh.help()                    sharding helpers
        rs.help()                    replica set helpers
        help admin                   administrative help
        help connect                 connecting to a db help
        help keys                    key shortcuts
        help misc                    misc things to know
        help mr                      mapreduce

        show dbs                     show database names
        show collections             show collections in current database
        show users                   show users in current database
        show profile                 show most recent system.profile entries with time >= 1ms
        show logs                    show the accessible logger names
        show log [name]              prints out the last segment of log in memory, 'global' is default
        use <db_name>                set current database
        db.foo.find()                list objects in collection foo
        db.foo.find( { a : 1 } )     list objects in foo where a == 1
        it                           result of the last line evaluated; use to further iterate
        DBQuery.shellBatchSize = x   set default number of items to display on shell
        exit                         quit the mongo shell

// 查看所有数据级别的操作
> db.help()
// 查看集合级别的操作
> db.mycoll.help()
// 列举数据库命令
> db.listCommands()

> show collections
xinchen_contact
xinchen_dept
> db.xinchen_contact.help()
DBCollection help
        db.xinchen_contact.find().help() - show DBCursor help
      ...

查询数据

db.lianjia.find({xiaoqu_url: ''}) 

lianjia 是一个集合名字

xiaoqu_url 是一个字段名字

删除数据

在collection 位置写上自己要删除哪个集合的文档(document)

db.collection.remove({xiaoqu_url: ''})

导入数据

导入一个 json 文件的 数据

在 命令行中 而不是 mongodb 的 shell 中

mongoimport --db qq --collection qa --file C:/Users\bai/Desktop/lianjia.json

mongoimport --db scrapy_mongo --collection lianjia_result --file C:/Users/bai/Desktop/lianjia_result.json



// db 后面是 数据库名字
// collection 后面是集合名字

更新

更新一个字段

db.message.update({'litao':'99'},{"$set":{"age":"2"}})

以下 是整个字典被覆盖

db.message.update({'litao':'99'},{"age":"2"})

命令行批量删除

db.xinchen_data.aggregate({$group:{ _id: {ELE_NO: '$ELE_NO'}, dups: {$addToSet: '$_id'}, count : {'$sum': 1}     }},{$match: {count: {$gt: 1}}} ).forEach(function(it){it.dups.shift();db.xinchen_data.remove({_id:{$in:it.dups}});})

// 数据太大的时候就需要开启。
{allowDiskUse:true}  
//这个是在出错的时候加在forEach 前面那个括号里面
// 也就是写在 group 中。

print——pretty 格式美化
// 这一看 完全就是 那啥 Javascript 语法 。 你看这个 forEach 然后 里面 写个回调函数。为数组中的每个元素执行一次回调函数。

db.xinchen_data.aggregate({
$group:{ 
    _id: {ELE_NO: '$ELE_NO'}, // 查询 ele_no 字段命名为 _id
    dups: {$addToSet: '$_id'}, // 将 我们查到的_id 项添到 dups 集合中
    count : {'$sum': 1}     }},// 统计 统计值 字段 命名为 count
    {$match: {count: {$gt: 1}}} ).forEach(// 匹配 count字段 大于 1 的字段
    function(it){
    it.dups.shift(); // 删除数组的第一个元素,并返回这个元素。 和 python的 pop 有点 像。不过pop是默认弹出 最后一个 或者自己指定 弹出元素。
    db.xinchen_data.remove({_id:{$in:it.dups}});})// 执行删除

关于 find 和 agg group分组的性能 对比 测试代码

虽然两边的比较没太大的意义。 毕竟一个是查找命令。 一个是 聚合命令。

agg

聚合统计 返回聚合后数据的游标。需要你遍历出来。(应该是 pymongo这样定义的。当然shell 中 会 返回20 条。 然后需要 你再 )

当然没有find 返回 游标来的快。

但是这里是直接去重之后的 数据

而 find 返回的游标。 遍历出来的数据 是 没有去重的。

如果我的目的是 去重 那么 当然 我会使用 agg


# Requires the PyMongo package.
# https://api.mongodb.com/python/current
import timeit
timeit.timeit("""
import pymongo
client = pymongo.MongoClient('mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false')
result = client['lianjia_db']['A_lianjia_deal_info'].aggregate([
    {
        '$group': {
            '_id': '$xiaoqu_url', 
            'fieldN': {
                '$sum': 1
            }
        }
    }
])

""",number=100)

find

import timeit
timeit.timeit("""
import pymongo
import redis

myclient = pymongo.MongoClient('mongodb://39.108.173.123:27017')  # mongo链接
r = redis.StrictRedis(host='39.108.173.123', port=6379, db=0)  # redis链接
# myclient = pymongo.MongoClient('mongodb://localhost:27017')  # mongo链接
# r = redis.StrictRedis(host='127.0.0.1', port=6379, db=0)  # redis链接
mydb = myclient['lianjia_db']  # mongo数据库
A_lianjia_deal = mydb['A_lianjia_deal_info']
B_lianjia_community_info = mydb['B_lianjia_community_info']
# cursor = A_lianjia_deal.find('null', {'city_name': '深圳', 'xiaoqu_url': 1})

# A_lianjia_deal.find({'city_name': {'$nin': ['上海']}})
# 不包含上海
cursor = A_lianjia_deal.find({'city_name': {
    '$nin': ['上海']
}}, {
    'xiaoqu_url': 1,
    '_id': 0
})  # 直接获取一个 深圳的 xiaoqu_url.
""",number=100)

基础的一些mongo命令使用示例

插入多条数据

db.inventory.insertMany( [
   { "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
   { "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
   { "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
   { "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
   { "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
]);

基础查询语句


查找特定的 字段

检索集合中的特定文档。可以通过应用筛选条件从集合中检索特定的文档。

myCursor = db.inventory.find( { status: "D" } )

遍历结果

默认情况下,shell只显示前20个文档并返回一个游标。当结果集只包含几个文档时,这就足够了。如果结果集更大,要查看查询的所有结果,请迭代游标。

需要结合上一条 查询特定字段 使用

while (myCursor.hasNext()) {
    print(tojson(myCursor.next()));
}

完全匹配查询

如果希望选择与嵌入JSON对象中的所有字段匹配的文档,请指定与嵌入文档完全匹配的文档,包括该嵌入文档中的所有字段和值,按它们在集合中出现的顺序排列。

myCursor = db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )

点语法

MongoDB使用点表示法来访问数组的元素和访问嵌入文档的字段。

{
contribs: [ "Turing machine", "Turing test", "Turingery" ],
}

要指定contribs数组中的第三个元素,请使用点符号“contribs.2”。

当查询使用点符号。,字段名和嵌套字段名必须放在引号内。下面的示例选择在size字段中嵌套字段uom等于“in”的所有文档

myCursor = db.inventory.find( { "size.uom": "in" } )

使用嵌入式字段和比较运算符读取数据

小于符号读取数据

以下示例从size.h字段小于15的清单集合中检索所有文档。MongoDB使用点表示法指定嵌入式文档中的字段。 size.h是指尺寸文档中的h字段。


myCursor = db.inventory.find( { "size.h": { $lt: 15 } } )

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GtzlIwKu-1601957889345)(AFE3154DDB2B4343878929111A7F8EEC)]

使用复合查询读取数据

编写一个隐式AND查询。

要在MongoDB中编写一个与所有查询谓词都匹配的复合查询(即逻辑AND),请在查找文档中指定要匹配的所有字段。 默认情况下,MongoDB匹配所有字段。

myCursor = db.inventory.find( { status: "A", qty: { $lt: 30 } } )

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oREutqhy-1601957889348)(F8A520921014460797A57AAD26705200)]

写一个"or"查询。

使用$or查询运算符,指定一个复合查询,该查询将每个子句与一个逻辑OR联接相连接,以便该查询选择集合中至少匹配一个条件的文档

myCursor = db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NDDHktA5-1601957889351)(EC8C66C470E04DA2BAD510ADB415659E)]

使用多个复合子句检索数据

使用or子句编写隐式AND查询。

在下面的示例中,复合查询文档选择状态为“ A”且qty小于30或item以字符p开头的集合中的所有文档:

myCursor = db.inventory.find( {
     status: "A",
     $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eRX4CH82-1601957889354)(16FCC2ACCEF6406D91D0252EA9D20CE5)]

基础更新语句


更新库存集合中的单个文档。

db.inventory.updateOne(
    { "item" : "paper" }, 
    {
      $set: {  "size.uom" : "cm",  "status" : "P" },
      $currentDate: { "lastModified": true }
    }
)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t5duUw5a-1601957889355)(9A6850DE56E44E289443CBE918963A24)]

更新前

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-txA2cCvx-1601957889357)(223FB7BBF22C40EFA2AB5700C173FA08)]

更新后

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bxBlh6iW-1601957889358)(4850E143D40B464CB127202C38CB63D6)]

更新多个文档。

以下操作更新数量小于50的所有单据。

db.inventory.updateMany(
    { "qty" : { $lt: 50 } }, 
    {
       $set: { "size.uom" : "cm", "status": "P" },
       $currentDate : { "lastModified": true }
    }
)

基础删除语句


删除一条语句

删除单个文档。下面的操作删除状态为D的第一个文档

db.inventory.deleteOne(
    { "status": "D" } 
)

删除多个文档。

以下操作将删除状态为A的指定清单集中的所有文档:

db.inventory.deleteMany(
    { "status" : "A" } 
)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cN9ScDrL-1601957889359)(B07E6B8C942C43E2994EDAB3E518E015)]


插入一条语句

db.inventory.insertOne(
   { "item" : "canvas",
     "qty" : 100,
     "tags" : ["cotton"],
     "size" : { "h" : 28, "w" : 35.5, "uom" : "cm" }
   }
)

读取所有数据

myCursor = db.inventory.find( {} )

remove方法

从集合中删除所有文档

这个操作并不等同于drop()方法。

要从集合中删除所有文档,使用drop()方法删除整个集合(包括索引),然后重新创建集合并重建索引,可能会更有效。

db.bios.remove( { } )
示例数据插入
db.bios.insertMany([{"_id":1,"name":{"first":"John","last":"Backus"},"birth":ISODate("1924-12-03T05:00:00Z"),"death":ISODate("2007-03-17T04:00:00Z"),"contribs":["Fortran","ALGOL","Backus-NaurForm","FP"],"awards":[{"award":"W.W.McDowellAward","year":1967,"by":"IEEEComputerSociety"},{"award":"NationalMedalofScience","year":1975,"by":"NationalScienceFoundation"},{"award":"TuringAward","year":1977,"by":"ACM"},{"award":"DraperPrize","year":1993,"by":"NationalAcademyofEngineering"}]},{"_id":ObjectId("51df07b094c6acd67e492f41"),"name":{"first":"John","last":"McCarthy"},"birth":ISODate("1927-09-04T04:00:00Z"),"death":ISODate("2011-12-24T05:00:00Z"),"contribs":["Lisp","ArtificialIntelligence","ALGOL"],"awards":[{"award":"TuringAward","year":1971,"by":"ACM"},{"award":"KyotoPrize","year":1988,"by":"InamoriFoundation"},{"award":"NationalMedalofScience","year":1990,"by":"NationalScienceFoundation"}]},{"_id":3,"name":{"first":"Grace","last":"Hopper"},"title":"RearAdmiral","birth":ISODate("1906-12-09T05:00:00Z"),"death":ISODate("1992-01-01T05:00:00Z"),"contribs":["UNIVAC","compiler","FLOW-MATIC","COBOL"],"awards":[{"award":"ComputerSciencesManoftheYear","year":1969,"by":"DataProcessingManagementAssociation"},{"award":"DistinguishedFellow","year":1973,"by":"BritishComputerSociety"},{"award":"W.W.McDowellAward","year":1976,"by":"IEEEComputerSociety"},{"award":"NationalMedalofTechnology","year":1991,"by":"UnitedStates"}]},{"_id":4,"name":{"first":"Kristen","last":"Nygaard"},"birth":ISODate("1926-08-27T04:00:00Z"),"death":ISODate("2002-08-10T04:00:00Z"),"contribs":["OOP","Simula"],"awards":[{"award":"RosingPrize","year":1999,"by":"NorwegianDataAssociation"},{"award":"TuringAward","year":2001,"by":"ACM"},{"award":"IEEEJohnvonNeumannMedal","year":2001,"by":"IEEE"}]},{"_id":5,"name":{"first":"Ole-Johan","last":"Dahl"},"birth":ISODate("1931-10-12T04:00:00Z"),"death":ISODate("2002-06-29T04:00:00Z"),"contribs":["OOP","Simula"],"awards":[{"award":"RosingPrize","year":1999,"by":"NorwegianDataAssociation"},{"award":"TuringAward","year":2001,"by":"ACM"},{"award":"IEEEJohnvonNeumannMedal","year":2001,"by":"IEEE"}]},{"_id":6,"name":{"first":"Guido","last":"vanRossum"},"birth":ISODate("1956-01-31T05:00:00Z"),"contribs":["Python"],"awards":[{"award":"AwardfortheAdvancementofFreeSoftware","year":2001,"by":"FreeSoftwareFoundation"},{"award":"NLUUGAward","year":2003,"by":"NLUUG"}]},{"_id":ObjectId("51e062189c6ae665454e301d"),"name":{"first":"Dennis","last":"Ritchie"},"birth":ISODate("1941-09-09T04:00:00Z"),"death":ISODate("2011-10-12T04:00:00Z"),"contribs":["UNIX","C"],"awards":[{"award":"TuringAward","year":1983,"by":"ACM"},{"award":"NationalMedalofTechnology","year":1998,"by":"UnitedStates"},{"award":"JapanPrize","year":2011,"by":"TheJapanPrizeFoundation"}]},{"_id":8,"name":{"first":"Yukihiro","aka":"Matz","last":"Matsumoto"},"birth":ISODate("1965-04-14T04:00:00Z"),"contribs":["Ruby"],"awards":[{"award":"AwardfortheAdvancementofFreeSoftware","year":"2011","by":"FreeSoftwareFoundation"}]},{"_id":9,"name":{"first":"James","last":"Gosling"},"birth":ISODate("1955-05-19T04:00:00Z"),"contribs":["Java"],"awards":[{"award":"TheEconomistInnovationAward","year":2002,"by":"TheEconomist"},{"award":"OfficeroftheOrderofCanada","year":2007,"by":"Canada"}]},{"_id":10,"name":{"first":"Martin","last":"Odersky"},"contribs":["Scala"]}])

删除所有符合条件的文档

要删除符合删除条件的文档,请使用参数调用remove()方法:

以下操作从数量大于20的收集产品中删除所有文档

db.products.remove( { qty: { $gt: 20 } } )

覆盖默认写问题

对副本集的以下操作从qty大于20的收集产品中删除所有文档,并将写关注点指定为“ w:多数”,wtimeout为5000毫秒,以便该方法在写传播为多数后返回 个有投票权的副本集成员或该方法在5秒钟后超时。

db.products.remove(
    { qty: { $gt: 20 } },
    { writeConcern: { w: "majority", wtimeout: 5000 } }
)

删除符合条件的单个文档

要删除符合删除条件的第一个文档,请使用查询条件并将justOne参数设置为true或1来调用remove方法。

以下操作从数量大于20的收集产品中删除第一个文档:

db.products.remove( { qty: { $gt: 20 } }, true )

归类

允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。

myColl集合包含以下文档:

{ _id: 1, category: "café", status: "A" }
{ _id: 2, category: "cafe", status: "a" }
{ _id: 3, category: "cafE", status: "a" }

以下操作包括排序规则选项

db.myColl.remove(
   { category: "cafe", status: "A" },
   { collation: { locale: "fr", strength: 1 } }
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值