本人 mongodb 用的比较少 水平就在那里。
简单的一些查询 大家可以收藏。 更深入的可以自行 在学会基础操作之后。 再 去学习官方的文档或者,一些视频学习。
可视化软件
- MongoDB Compass Community(官方文档那个网站中有)
- 将mongodb制作为服务(菜鸟教程中有)
MongoDB概念介绍
mysql是关系型数据库,有关联,需要按照字段存储
存储海量数据会比较麻烦.
MongoDB是一个分布式文件存储的数据库,可以没有关联.
处理海量数据比较方便,更有优势,数据少当然也可以使用的.
SQL与MongoDB对比
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
joins | joins | 表连接/MOngoDB不支持 |
primary key | primary key | 主键/MongoDB自动将_id字段设置为主键 |
MongoDB三元素:
三元素:数据库,集合,文档.
-
文档(
document
):
就是关系型数据库中的一行. 文档是一个对象 ,由键值组成,是Json的扩展形式{‘name’:‘abc’,‘gender’:‘1’}
-
集合(
collection
):
就是关系型数据库中的表.可以存储多个文档,结构可以不固定.如可以
存储如下文档在一个集合中(monggo给我的感觉就是js 的 object对象。 数组等。然后操作函数也很有 js 的风格。)
{'bname':'abc','gender':'1'}
{'name':'xxx','age':18}
{'title':'yyy','price':20.9}
基本操作命令
db
:查看当前的数据库show dbs
:查看所有的数据库use 数据库名
:切换数据库,如果数据库不存在,则创建一个数据库db.dropDatabase()
:删除当前指向的数据库db.集合名.insert(value)
:添加数据到指定的集合中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
mongodb
的 shell
完全支持 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 } } )
使用复合查询读取数据
编写一个隐式AND查询。
要在MongoDB中编写一个与所有查询谓词都匹配的复合查询(即逻辑AND),请在查找文档中指定要匹配的所有字段。 默认情况下,MongoDB匹配所有字段。
myCursor = db.inventory.find( { status: "A", qty: { $lt: 30 } } )
写一个"or"查询。
使用$or查询运算符,指定一个复合查询,该查询将每个子句与一个逻辑OR联接相连接,以便该查询选择集合中至少匹配一个条件的文档
myCursor = db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
使用多个复合子句检索数据
使用or
子句编写隐式AND
查询。
在下面的示例中,复合查询文档选择状态为“ A”且qty小于30或item以字符p开头的集合中的所有文档:
myCursor = db.inventory.find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )
基础更新语句
更新库存集合中的单个文档。
db.inventory.updateOne(
{ "item" : "paper" },
{
$set: { "size.uom" : "cm", "status" : "P" },
$currentDate: { "lastModified": true }
}
)
更新前
更新后
更新多个文档。
以下操作更新数量小于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" }
)
插入一条语句
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 } }
)