1 本地使用,mongo shell指令
在安装路径,使用控制台执行 mongo.exe, 自动连接127.0.0.1:27017
db # 显示当前数据库
show dbs # 显示当前所有数据库和使用空间。
db.adminCommand( { listDatabases: 1 } ) # 显示所有 db
use users # 选择 users 数据库
查看当前数据库的所有连接集合,即关系型数据库的表
show collections
副本集设置 replSet, windows是在安装目录下 mongod.exe
mongod --port 27017 --dbpath " \MongoDB\backup\data" --replSet rs0
2 常用操作
管道 pipeline: 所有 在 1970-01-01出生的人
var pipeline =3D [ {"$unset": [ "_id", "address", ]}, =20 =20 // Only match people born on or after 1st January 1970 {"$match": { "dateofbirth": {"$gte": ISODate("1970-01-01T00:0=0:00Z")}, }},
=20
/* {"$sort": { "dateofbirth": -1, }}, =20 =20 {"$limit": 2}, =20 */ ];
小于某个值的数据
表达式 $$NOW 筛选全部年龄低于18的人 $lt var pipeline =3D [ {"$match": {"$expr":{ "$lt": ["$dateofbirth", {"$subtract": [= "$$NOW", 18<=/span>365.25246060*1000]}]
}},
},
大于某个值的数据
匹配产品价格大于 15.00 的商品。$gt {"$match": { "products.price": { "$gt": NumberDecimal("15.00"), }, }},
3 连接管理
我们先不理会连接池。 创建单个连接需要哪些步骤,如果从传输层连接开始,那么将很漫长。
所以这里只看第三方库如何创建和管理的连接。
使用连接库: pymongo操作, 指令是从右到左顺序执行的。
pymongo代码指令
创建连接
cli = pymongo.MongoClient('127.0.0.1', 27017)
创建数据库test
db = cli.test db.name test
查看连接属性
db.my_collection Collection(Database(MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True), 'test'), 'my_collection')
4 查询指令
查询最近N个数据,按create_time由近及远排序
db.history_vedio_info.find().limit(10).sort({"create_time":-1})
查询最近5个
db.history_vedio_info.find().limit(5).sort({"create_time":-1})
模糊查询, 中间匹配
db.history_vedio_info.find({"start_time":/2020-12-17/}).sort({"create_time":-1}).count()
模糊查询 以 2020-12-17 开头的
db.user.find(name:/^2020-12-17/);
模糊查询不区分大小写
db.user.find(name:/a/i);
去重
字段去重
db.getCollection("表名").distinct("字段名");
某字段的按条件去重
db.getCollection("表名").distinct('字段名',{筛选条件})
嵌入字段去重
db.getCollection("distinct").distinct("article_numbers.vol")
去重后统计
db.student.distinct("name",{"age" : 18}).length
表名去重
db.collection.distinct()
聚合查询
db.student.aggregate([
{$match:{"age" : 18}},
{$project:{"name":true}},
{$group:{_id:"$name"}},
{$group:{_id:null,count:{$sum:1}}}
])- 查询表
socket_users 中所有name 并隐藏id,美观显示, and 关键字两个条件同时满足
db.socket_users.find({$and:[{"name":"jack", "id":3}]}).pretty()
投影查询,with projection is as follows , 即只显示集合的某一部分 只显示文档的title部分,
db.mycol.find({}, {"title":1, _id:0})
查询限制 limit 和 查询跳跃 skip
db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
只显示第二个文档
db.COLLECTION_NAME.find().limit(1).skip(1)
最近5个
db.history_vedio_info.find().limit(5).sort({"create_time":-1})
查询排序
1表示升序索引
查询收集集合的数据按title升序排列db.COLLECTION_NAME.find().sort({“title”:1})
-1 降序索引
多个字段索引,title 1 升序索引,description -1 降序索引
db.mycol.createIndex({"title":1,"description":-1})
聚合查询
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
显示一个列表,显示每个用户编写了多少教程
db.mycol.aggregate([{$group:{_id:"$by_user", num_tutorial:{$sum:1}}}])
5 写入数据
插入一条数据
db.my_collection.insert_one({"x":10}).inserted_id
ObjectId('5fa0e195be9d31bf346b0c75')
插入两条相同数据,mongodb 默认id是hash自增的
db.my_collection.insert_one({"x":110}).inserted_id
...
db.my_collection.insert_one({"x":110}).inserted_id
查找最近的一条数据
db.my_collection.find_one()
{'_id': ObjectId('5fa0e210be9d31bf346b0c77'), 'x': 110}
查找全部数据并遍历,升序排序
for item in db.my_collection.find().sort("x", pymongo.ASCENDING):
print(item["x"])
10
101
110
110
1034
查找数据x并按x排序,默认升序
[item["x"] for item in db.my_collection.find().sort("x")]
[10, 101, 110, 110, 1034]
[item["x"] for item in db.my_collection.find().sort("x", pymongo.ASCENDING)]
[10, 101, 110, 110, 1034]
从查询的所有数据中 跳过第一个数,并限取两个数
[item["x"] for item in db.my_collection.find().limit(2).skip(1)]
[10, 101]
6 pymongo 常用操作
创建客户端
import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)
指定数据库
db = client.test
或者
db = client['test']
指定集合(表)
collection = db.students
collection = db['students']
插入数据
student = {
'id': '20170101',
'name': 'Jordan',
'age': 20,
'gender': 'male'
}
result = collection.insert(student)
插入多条数据,传入列表即可
students = [{
'id': '20170101',
'name': 'Jordan',
'age': 20,
'gender': 'male'
}, {
'id': '20170102',
'name': 'Jordans',
'age': 21,
'gender': 'male'
}]
result = collection.insert(students)
更新,指定更新的条件和更新后的数据即可
condition = {"name":"Kexin"} student = collection.find_one(condition) student['age'] = 25 result = collection.update(condition, student) print(result) {'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True} # ok代表执行成功,nModified代表影响的数据条数
$set
使用 \$set可以只更新student字典内存在的字段。如果原先还有其他字段,则不会更新,也不会删除。
而如果不用\$set的话,则会把之前的数据全部用student字典替换;如果原本存在其他字段,则会被删除
res = collection.update(condition, {'$set':student})
7 删除
删除示例,某字段相同的所有记录
db.info.aggregate([
{
$group:{_id:{web_url:"$web_url"},count:{$sum:1},dups:{$addToSet:"$_id"}}
},
{
$web_url:{count:{$gt:1}}
}
]).forEach(function(doc){
doc.dups.shift();
db.info.remove({_id:{$in:doc.dups}});
})
8 小结
mongdb可用于写日志,有现成的 参数可用,而不必 组织后端日志知识。
除了这些性能因素之外,日志数据是通常可以利用无模式集合的数据集之一。
mongodb 拥有一项 功能称为 顶点集。 capped collection.
我们创建的所有隐式创建的集合都只是普通的集合。
我们可以使用 db.createCollection 创建一个顶点集合。
如下示例,并将其标记为上限1M:
db.createCollection('logs', {capped: true,size: 1048576})
当顶点集到达限制,1MB后,旧的文档 立即被清理掉。
文件的大小,限制都可使用 MAX指定。
顶点集有一些有用的属性
比如 更新 顶点集的 文档而不必改变其 大小。
像tail 一个linux文件一样,tail 顶点集中的文档。
expire 可设置一个文档的 生存时间,就像TTL一样。