是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

简介

MongoDB 下载安装

MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www.mongodb.com/download-center/community

注意:在 MongoDB 2.2 版本后已经不再支持 Windows XP 系统。最新版本也已经没有了 32 位系统的安装文件。

img
  • MongoDB for Windows 64-bit 适合 64 位的 Windows Server 2008 R2, Windows 7 , 及最新版本的 Window 系统。
  • MongoDB for Windows 32-bit 适合 32 位的 Window 系统及最新的 Windows Vista。 32 位系统上 MongoDB 的数据库最大为 2GB。
  • MongoDB for Windows 64-bit Legacy 适合 64 位的 Windows Vista, Windows Server 2003, 及 Windows Server 2008 。

下载 .msi 文件,下载后双击该文件,按操作提示安装即可。

安装过程中,你可以通过点击 “Custom(自定义)” 按钮来设置你的安装目录。

img img

下一步安装 “install mongoDB compass” 不勾选(当然你也可以选择安装它,可能需要更久的安装时间),MongoDB Compass 是一个图形界面管理工具,我们可以在后面自己到官网下载安装,下载地址:https://www.mongodb.com/download-center/compass。

img

创建数据目录

MongoDB 将数据目录存储在 db 目录下。但是这个数据目录不会主动创建,我们在安装完成后需要创建它。请注意,数据目录应该放在根目录下 (如: C:\ 或者 D:\ 等 )。

在本教程中,我们已经在 C 盘安装了 mongodb,现在让我们创建一个 data 的目录然后在 data 目录里创建 db 目录。

cd C:\
md "\data\db"

你也可以通过 window 的资源管理器中创建这些目录,而不一定通过命令行。


命令行下运行 MongoDB 服务器

为了从命令提示符下运行 MongoDB 服务器,你必须从 MongoDB 目录的 bin 目录中执行 mongod.exe 文件。

C:\mongodb\bin\mongod --dbpath c:\data\db

如果执行成功,会输出如下信息:

2015-09-25T15:54:09.212+0800 I CONTROL  Hotfix KB2731284 or later update is not
installed, will zero-out data files
2015-09-25T15:54:09.229+0800 I JOURNAL  [initandlisten] journal dir=c:\data\db\j
ournal
2015-09-25T15:54:09.237+0800 I JOURNAL  [initandlisten] recover : no journal fil
es present, no recovery needed
2015-09-25T15:54:09.290+0800 I JOURNAL  [durability] Durability thread started
2015-09-25T15:54:09.294+0800 I CONTROL  [initandlisten] MongoDB starting : pid=2
488 port=27017 dbpath=c:\data\db 64-bit host=WIN-1VONBJOCE88
2015-09-25T15:54:09.296+0800 I CONTROL  [initandlisten] targetMinOS: Windows 7/W
indows Server 2008 R2
2015-09-25T15:54:09.298+0800 I CONTROL  [initandlisten] db version v3.0.6
……

连接MongoDB

我们可以在命令窗口中运行 mongo.exe 命令即可连接上 MongoDB,执行如下命令:

C:\mongodb\bin\mongo.exe

python操作MongonDB

连接数据库、指定数据库、指定集合、插入数据:

mongodb存储数据以键值形式, 因此在Python中使用字段插入数据.

import pymongo

#连接mongodb
client = pymongo.MongoClient('mongodb://localhost:27017/')
#指定数据库
db = client.test4
#指定集合
collection = db.students
#数据
student1 = {
    'id': '201801',
    'name': 'Jack',
    'age': 20,
    'gender': 'male'
}
student2 = {
    'id': '201802',
    'name': 'Tom',
    'age': 22,
    'gender': 'male'
}
student3 = {
    'id': '201803',
    'name': 'Rose',
    'age': 21,
    'gender': 'female'
}
student4 = {
    'id': '201804',
    'name': 'Mike',
    'age': 20,
    'gender': 'female'
}
student5 = {
    'id': '201805',
    'name': 'Ray',
    'age': 20,
    'gender': 'female'
}
student6 = {
    'id': '201806',
    'name': 'Alan',
    'age': 21,
    'gender': 'male'
}
#插入一条数据
result1 = collection.insert_one(student1)
print(result1)
print(result1.inserted_id)

# #插入多条数据
result2 = collection.insert_many([student2, student3, student4, student5, student6])
print(result2)
print(result2.inserted_ids)
运行结果:
insert方法: 
5b3a1942971951218d41c02b
[ObjectId('5b3a1942971951218d41c02c'), ObjectId('5b3a1942971951218d41c02d')]
官方推荐: 
<pymongo.results.InsertOneResult object at 0x7fa4cc363ec8>
5b3a1942971951218d41c02e
<pymongo.results.InsertManyResult object at 0x7fa4cc363f08>
[ObjectId('5b3a1942971951218d41c02f'), ObjectId('5b3a1942971951218d41c030')]

3. 查询、计数、排序、偏移:

import pymongo
from bson.objectid import ObjectId

client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = db.students

#查询一条数据
print('单条数据','='*50)
result = collection.find_one({'name': 'Jack'})
print(result)

print('多条数据','='*50)
#查询多条数据
for res in collection.find({'age': {'$mod': [5, 0]}}):
    print(res)

#计数
print('计数','='*50)
count = collection.find({'age': {'$mod': [5, 0]}}).count()
print(count)

#排序
print('排序','='*50)
results = collection.find().sort('name', pymongo.ASCENDING) #升序, pymongo.DESCENDING为降序
print([result['name'] for result in results])

#偏移
print('偏移','='*50)
results = collection.find().sort('name', pymongo.ASCENDING).skip(2) #偏移2位,忽略前两个数据
print([result['name'] for result in results])
results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2) #只输出2个数据
print([result['name'] for result in results])

find({‘age’: {’$mod’: [5, 0]}}): 表示查找年龄取余5余0的值. 还有很多比较符号, 请百度.

运行结果:
单条数据 ==================================================
{'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}
多条数据 ==================================================
{'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('5b3a1942971951218d41c02e'), 'id': '201804', 'name': 'Mike', 'age': 20, 'gender': 'female'}
{'_id': ObjectId('5b3a1942971951218d41c02f'), 'id': '201805', 'name': 'Ray', 'age': 20, 'gender': 'female'}
计数 ==================================================
3
排序 ==================================================
['Alan', 'Jack', 'Mike', 'Ray', 'Rose', 'Tom']
偏移 ==================================================
['Mike', 'Ray', 'Rose', 'Tom']
['Mike', 'Ray']

4. 更新:

4.1 不使用$set更新数据:
import pymongo
from bson.objectid import ObjectId

client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = db.students

#修改
condition = {'name': 'Jack'}
student = collection.find_one(condition) #获得满足condition的数据

print('更新前: ', student)

student['age'] = 22 #修改年龄
result = collection.update(condition, student) #将修改后的student替换condition

print('更新后', collection.find_one(condition))

#更新的返回值
print(result) #ok=1代表执行成功, nModified代表影响的条数
运行结果:
更新前:  {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 20, 'gender': 'male'}
更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 22, 'gender': 'male'}
{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}
4.2 使用$set更新数据:
import pymongo
from bson.objectid import ObjectId

client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = db.students

#使用$set更新
condition = {'name': 'Jack'}
student = collection.find_one(condition) #获得满足condition的数据

print('更新前: ', student)

student['age'] = 23 #修改年龄
result = collection.update(condition, {'$set': student}) #将修改后的student替换condition, $set为重点

print('更新后', collection.find_one(condition))

#更新的返回值
print(result) #ok=1代表执行成功, nModified代表影响的条数
运行结果:
更新前:  {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 22, 'gender': 'male'}
更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 23, 'gender': 'male'}
{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}

比较使用和不适用$set更新数据, 发现此时并没有什么区别.

下面介绍区别所在:

4.3 区别
import pymongo
from bson.objectid import ObjectId

client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = db.students

#使用和不使用$set更新的区别
print('使用: ')
condition = {'name': 'Jack'}
student = collection.find_one(condition) #获得满足condition的数据

print('更新前: ', student)

student = {
    'id': '201803',
    'name': 'Jack',
    'age': 20,
    'gender': 'female',
    'mother': "Jack's mother"
}

result = collection.update(condition, {'$set': student}) #将修改后的student替换condition

print('更新后', collection.find_one(condition))

#更新的返回值
print(result) #ok=1代表执行成功, nModified代表影响的条数

#分割线
print()
print('='*20, '分割线', '='*20)
print()

print('不使用: ')
condition = {'name': 'Jack'}
student = collection.find_one(condition) #获得满足condition的数据

print('更新前: ', student)

student = {
    'id': '201803',
    'name': 'Jack',
    'age': 20,
    'gender': 'female',
    'father': "Jack's father"
}

result = collection.update(condition, student) #将修改后的student替换condition

print('更新后', collection.find_one(condition))

#更新的返回值
print(result) #ok=1代表执行成功, nModified代表影响的条数
运行结果:
使用: 
更新前:  {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201801', 'name': 'Jack', 'age': 23, 'gender': 'male'}
更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'mother': "Jack's mother"}
{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}

==================== 分割线 ====================

不使用: 
更新前:  {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'mother': "Jack's mother"}
更新后 {'_id': ObjectId('5b3a1942971951218d41c02b'), 'id': '201803', 'name': 'Jack', 'age': 20, 'gender': 'female', 'father': "Jack's father"}
{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}

分析上面运行结果, 可以发现使用$set时, 若更新数据有原数据没有的字段, 则将该字段加到原数据上(上例为新增了mother字段), 而不会删除任何字段. 相反, 若不使用set时, 将从原数据中删除更新数据没有的字段, 再加上新增字段(上例为删除了mother字段, 新增了father字段. 也可以理解为将原数据完全替换为更新数据)

4.4 update_one和update_many的区别:
import pymongo
from bson.objectid import ObjectId

client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = db.students

#官方推荐使用
#update_one和update_many的区别
print('update_one: ')
condition = {'age': {'$gt': 20}}
result = collection.update_one(condition, {'$inc': {'age': 1}})
print(result)
print(result.matched_count, result.modified_count)

#分割线
print()
print('='*20, '分割线', '='*20)
print()

print('update_many: ')
condition = {'age': {'$gt': 20}}
result = collection.update_many(condition, {'$inc': {'age': 1}})
print(result)
print(result.matched_count, result.modified_count)
运行结果:
update_one: 
<pymongo.results.UpdateResult object at 0x7f6cace0f9c8>
1 1

==================== 分割线 ====================

update_many: 
<pymongo.results.UpdateResult object at 0x7f6cace0fa88>
3 3

{‘age’: {’$gt’: 20}}为查找年龄大于20的, {‘inc’: {‘age’: 1}}为将年龄+1

5. 删除:

import pymongo
from bson.objectid import ObjectId

client = pymongo.MongoClient('mongodb://localhost:27017/')
db = client.test4
collection = db.students

#删除
result = collection.remove({'name': 'Jack'})
print(result)
#推荐使用
result = collection.delete_one({'age': {'$gt': 20}})
print(result.deleted_count)

result = collection.delete_many({'age': {'$gt': 20}})
print(result.deleted_count)
运行结果:
{'ok': 1, 'n': 1}
1
2