MongoDB
MongoDB属于非关系型数据库,基本概念涉及文档,集合,数据库。
-
文档(document):MongoDB中数据的基本单元,文档中有唯一的标识:"_id",在整个集合中是唯一的,文件被插入时如果没有这一项,会自动添加。
文档的键值对时有顺序的。,顺序不同认定为不同的文档。
文档的值可以使用字符串,整数,数组,以及文档等类型。
文档的键是用双引号标识的字符串,不能含有空字符,点号“.“和”$"被保留,存在特定含义,最好不要用来命名,以”_"开头的键是保留的,不建议使用。
文档区分大小写以及值类型,例如{“age”: 24} != {“age”: “24”} != {“Age”: 24}都是不同的。 -
集合(collection):集合在MongoDB中是一组文档,存在于数据库中,没有固定的结构,在集合中可以插入不同类型的数据。
集合名不能为空,且不能含有空字符串。
集合不能以"system.“开头,这是为系统保留的前缀,创建名称不能含有保留字符,比如”$". -
数据库(database):一个MongoDB可以建立多个数据库,MongoDB的单个实例可以容纳多个独立的数据库,每个一有自己的权限和集合,使用show dbs可以查看所有的数据库。
创建与删除数据库
use DATABASE_NAME(数据库名),例如:use CSDN,如果CSDN数据库存在即跳转至CSDN数据库下,如果不存在,则创建新的数据库,数据库和集合为惰性创建,直到插入第一个数据才会显示,否则不显示。
删除数据库语法:db.dropDatabase(),可以删除当前数据库,使用db命令可以查询当前数据库名。
集合中文档的增删改查
- 插入文档,使用insert()或者save()方法向集合中插入文档。
db.collection_name(集合名).insert(document\文档)
例如:
db.python.insert({"title": "python",
"likes": 100,
"tags": ["编程", "脚本"],
"url": "https://www.baidu.com"
})
以上示例集合名称为python,如果该集合不存在,会自动创建集合并插入文档。
2.查询文档,使用find()方法啊从集合中查询文档,可使用pretty()方法使数据更易读。
db.collection_name.find().pretty()
例如:
db.python.find()
MongoDB中条件语句和操作符
- 等于:{key: value},例:db.python.find({“likes”: 100}),在python集合中找到likes等于100的文档
- 小于($lt):{key: {$lt: value}},例:db.python.find({“likes”: {$lt: 100}}),在python集合中找到likes小于100的文档。
- 小于等于($lte):{key: {$lte: value}},例:db.python.find({“likes”: {$lte: 100}}),在python集合中找到likes小于等于100的文档。
- 大于($gt):{key: {$gt: value}},例:db.python.find({“likes”: {$gt: 100}}),在python集合中找到likes大于100的文档。
- 大于等于($gte):{key: {$gte: value}},例:db.python.find({“likes”: {$gte: 100}}),在python集合中找到likes大于等于100的文档。
- 不等于($ne):{key: {$ne: value}},例:db.python.find({“likes”: {$ne: 100}}),在python集合中找到likes不等于100的文档。
find()方法可以使用多个键,以逗号隔开,实现and条件:
db.collection_name.find({key1: value1}, {key2: value2})
查找满足条件1且满足条件2
OR条件语句使用关键字“$or"
db.collection_name.find({$or: [{key1: value1}, {key2: value2}])
查找满足条件1或条件2
and条件和or条件可以同时使用
db.collection_name.find({“likes”: {$lte: 100}, $or: [{“title”: “python”}, {“tags”: “编程”, “脚本”}]})
更新文档
使用update()和save()方法来更新集合中的文档。
update()用以更新以存在的文档。
db.collection_name.update(
query,
update,
{upsert: boolean,
multi: boolean,
writeConcern: document
}
)
- query:update的查询条件。
- update:update的对象和一些更新的操作符等。
- upsert:可选,如果不存在update的记录,是否插入新文档,True为插入,默认False
- multi:可选,默认False,只更新找到的第一条记录,若为True,把按条件查出来的全部更新。
- writeConcern:可选,抛出的异常级别。
db.python.update({"title": "python"}, {$set: {"title": "python_spider"}}, {multi: True})
save()方法通过传入的文档替换已有的文档。
db.collection_name.save(
document,
{writeConcern: document}
)
- document:文档数据。
- writeConcern:抛出异常级别。
例如,替换_id为123456f78la9的文档数据。
db.python.save(
{
"_id": ObjectId("123456f78la9"),
"title": "MongoDB",
"url": "https://www.baidu.com"
}
)
删除文档,使用remove()方法。
db.collection_name.remove(
query,
{
justOne: boolean,
writeConcern: document
}
)
- query:可选,删除文档的条件。
- justOne:可选,若设置为True或者1,就只删除一个文档。
- writeConcern:可选,抛出异常的级别。
例:db.python.remove({“title”: “python”})
如果没有query,则删除所有文档。
Python操作MongoDB
import pymongo
pymongo模块使用MongoClient对象描述一个数据库客户端,所需参数为‘host’和’port’
client = pymongo.MongoClient()
client = pymongo.MongoClient('localhost', 27017)
client = pymongo.MongoClient('mongodb://localhost:27017/')
获取数据库
一个MongoDB实例可以支持多个独立的数据库,可以通过访问MongoClient的属性的方式来访问数据库:
db = client.papers
如果数据库的名字导致属性访问不能用,可以通过字典进行访问:
db = client['pa-pers']
获取集合和获取数据库的方法一致
db = client.books 或者 db = client['books']
插入文档
数据在MongoDB中是以JSON类文件形式保存的。使用insert()方法插入文档。
book = {"author": "mike",
"text": "python",
"date": datetime.datetime.utcnow()
}
book_id = collection.insert(book)
文档被插入后,如果文件内没有_id这个值,系统会自动添加一个到文件中,这是一个特殊值,在整个集合中是唯一的。insert()返回这个文件的_id值。
除了单个文件插入,也可以通过给insert()方法传入可迭代的对象作为第一个参数,进行批量插入的操作。
book = [
{"author": "mike", "text": "python"},
{"author": "jack", "age": 25},
{"tags": "hack", "date": datetime.datetime.utcnow()}
]
book_id = collection.insert(book)
查询文档
最基本的查询方法就是find_one,返回一个符合查询条件的文件,或者在没有匹配的时候返回None。
collection.find_one()
返回结果是一个之前插入的符合条件的字典类型值,返回文件中有_id这个值,是数据库添加的。
find_one()支持对特定元素进行匹配查询。
collection.find_one({”title“: "python"})
若想获得多个文档,可以使用find()方法,可以获取每个符合查询条件的文档。
for book in collection.find():
print(book)
需要知道符合条件的文档有多少:
collection.find({"title": "python"}).count()
修改文档可以使用save()和update()方法对文档跟新,和之前那shell中方法类似。
collection.update({"author": "mike"}, {"$set": {"text": "python_book"}})
删除文档,使用remove()方法。
collection.remove({"author": "mike"})