Python中MongoDB的使用方法
一、MongoDB是什么
在百度上查询的时候主要看到三个关键字,数据库、非关系型、查询功能强大。总结为查询功能强大的非关系型数据库。什么是数据库,应该是用来存储数据的,非关系型的意思???不不不,关系型的意思我都不懂,查询功能强大的意思应该是查询起来很方便,应该有很多不同的方法的来查询需要的数据。
二、为什么使用MongoDB
简而言之就是MongoDB有什么优点,你以为我会很正经的列出一大堆理由????不不不,我会告诉你选择MongoDB的原因是我在看《用Python学网络爬虫》!!!!!里面就用到了MongoDB!!!!!
三、MongoDB怎么在Python中使用
正文终于开始了!!!!!!大家快拿小本本,把知识点记起来!!!!!因为我的最终目的是为了实现《用Python写网络爬虫》的代码,所以就直接写pymongo的用法了,至于怎么安装和配置会在另外一篇文章中介绍,谁叫我是为了看懂代码,连MongoDB都还没安装就来吹MongoDB怎么使用呢。。。。。
1、怎么连接MongoDB
from pymongo import MongoClient
client = MongoClient('localhost',27017)
上述代码的意思是MongoDB连接上本地主机,端口号为27017
2、怎么获得数据库
db = client.primer
cache是数据库的名字,可以随便取
3、怎么获得集合
collection = db.students
4、查看数据库中的所有集合
db.collection_names()
5、怎么删除一个集合
db.collection.drop()
collection是集合的名字
6、怎么查看集合中的数据数目
db.collection.count()
7、怎么插入数据
db.students.insert()
db.students.insert_one()
db.stendents.insert_many([])
暂时发现的就只有这三种方法,三种方法返回的类型并不一样。
insert()返回值是‘_id’的值,若‘_id’缺省,'_id'的值为bson.objectid的ObjectId。该方法可以插入多条数据也可以直插入一条数据。
insert_one()返回值是InsertOneResult,可以根据dir()查看该对象的属性值
insert_many()能一次插入多条数据,返回值是InsertManyResult对象。
8、怎么删除集合中的数据
remove()
delete_one()
delete_many()
remove()能只删除一条数据,也可以删除多条数据,参数是query,即匹配条件。返回值是字典,可以查看删除了多少条数据。当需要只删除一条数据时,multi=False,默认值为True。
delete_one和delete_many顾名思义,和删除多条或单条数据的remove一样,只不过返回值为DeleteResult
9、怎么更新数据
update()
find_and_modify()
我觉得两个方法都是一样的,但是update可以更改多条数据,find_and_modify就算添加multi=True同样不能更新多条数据。所以下面主要讲update方法。
update的第一个参数是query,即查询条件,第二个是更新内容,第三个是upsert,第四个是multi。upsert是若匹配的数据没有更新属性,则添加,否则不更新该属性。multi为True时,能更新所有匹配数据。upsert在没有使用‘$set’的时候,会吧更新内容替代匹配数据,慎用!!!!
$set 更新任意字段
db.students.update(
{'age':{'$lt':28}},
{'$set':{'age':26}},
upsert=True,
multi=True
)
$unset 删除任意字段
db.students.update(
{},
{'$unset':{'age':1}},
upsert=True,
multi=True
)
$push 在特定字段追加内容
若该字段存在,则在后面追加内容,若不存在则添加仅有该追加内容的数组,若字段存在但值不为数组,则报错。
db.students.update(
{},
{'$push':{'new':4}},
upsert=True,
multi=True
)
$pushAll 在特定字段追加数组,与$push使用方法一致
$addToSet 在特定字段追加内容,与$push一样一样的!
$pop 在特定字段删除内容
$pull 在特定字段删除内容,与$pop一样
$pullAll 在特定字段删除内容,内容为数据
10、怎么查找数据
find(query,projection)
query是查找条件
projection可以选择显示那些键,有两种模式,第一种是需要显示的字段置1,其他字段均不显示;第二种是不需要显示的字段置0,显示其他字段。两种模式不能混用。
db.students.find(
{},
projection = {
'age' : 1,
'name' : 1
}
)
11、比较符号
$lt <
$gt >
$lte <=
$gte >=
$eq =
$ne !=
12、逻辑符号
$and 逻辑与 a == True and b == True
$or 逻辑或 a == True or b == True
$not 逻辑非 a != True
$nor 逻辑非或 a != True or b != True
13、Element
$exists 判断某个字段是否存在
db.students.find(
{
'age'{'$exists':1}
}
)
$type 判断某个字段值得类型
db.students.find(
{
'age'{'$type':1}
}
)
附上每个类型的代表的数值
Type | Number | Alias | Notes |
---|---|---|---|
Double | 1 | “double” | |
String | 2 | “string” | |
Object | 3 | “object” | |
Array | 4 | “array” | |
Binary data | 5 | “binData” | |
Undefined | 6 | “undefined” | Deprecated. |
ObjectId | 7 | “objectId” | |
Boolean | 8 | “bool” | |
Date | 9 | “date” | |
Null | 10 | “null” | |
Regular Expression | 11 | “regex” | |
DBPointer | 12 | “dbPointer” | Deprecated. |
JavaScript | 13 | “javascript” | |
Symbol | 14 | “symbol” | Deprecated. |
JavaScript (with scope) | 15 | “javascriptWithScope” | |
32-bit integer | 16 | “int” | |
Timestamp | 17 | “timestamp” | |
64-bit integer | 18 | “long” | |
Decimal128 | 19 | “decimal” | New in version 3.4. |
Min key | -1 | “minKey” | |
Max key | 127 | “maxKey” |
14、其他我记得的符号
$mod 求模
{ field: { $mod: [ divisor, remainder ] } }
$all 对值为数组的字段进行匹配,需要包含所有的元素,不计顺序
{ <field>: { $all: [ <value1> , <value2> ... ] } }
$elemMatch 对值为数组的字段进行一个个的匹配
{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }
$size 对值为数组的字段进行长度的筛选
db.collection.find( { field: { $size: 2 } } );