MongoDB学习记录
Posted 风过无痕521
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB学习记录相关的知识,希望对你有一定的参考价值。
一、操作符
"$lt" :"<"
"$lte" :"<="
"$gt" :">"
"$gte" :">="
"$ne" :"!="
"$in" :查询匹配指定条件值的文档;
"$nin" :查询不匹配指定条件值的文档;
"$or" :或查询
如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {<key>:<value> } |
db.col.find({"by":"菜鸟教程"}).pretty() |
where by = \'菜鸟教程\' |
小于 | {<key>:{$lt:<value>}} |
db.col.find({"likes":{$lt:50}}).pretty() |
where likes < 50 |
小于或等于 | {<key>:{$lte:<value>}} |
db.col.find({"likes":{$lte:50}}).pretty() |
where likes <= 50 |
大于 | {<key>:{$gt:<value>}} |
db.col.find({"likes":{$gt:50}}).pretty() |
where likes > 50 |
大于或等于 | {<key>:{$gte:<value>}} |
db.col.find({"likes":{$gte:50}}).pretty() |
where likes >= 50 |
不等于 | {<key>:{$ne:<value>}} |
db.col.find({"likes":{$ne:50}}).pretty() |
where likes != 50 |
MongoDB 查询文档
二、链式操作
append方法:尤其适用于日期等区间查询条件。
三、一些基本操作
db.createCollection(\'user\'); --创建表
db.getCollection(\'user\').remove({\'_id\':1}); --删除记录
db.getCollection(\'user\').ensureIndex({"email":1}); --新建索引
db.getCollection(\'user\').insert({ --插入记录
"_id" : 1,
"email" : "xxx@mtime.com",
"name" : "哈哈",
"salt" : "5927eb03f6ee9428bc55aa0d",
"pwd" : "121212",
"admin" : true,
"roles" : [
],
"subjects" : [
1,
2,
3,
4
],
"status" : 1,
"muser" : 1,
"mtime" : ISODate("2017-07-10T01:21:19.359Z")
}
);
--修改记录
db.getCollection(\'language\').update({},{$set:{muser:5,mtime:new Date()}},false,true);
db.getCollection(\'language\').update({},{$unset:{\'modifyTime\':\'\'}},false, true); --删除列
db.getCollection(\'language_pack\').update({},{$set:{modifyUser:5,modifyTime:new Date()}},false,true);
db.getCollection(\'activity\').update({_id:25}, {$set: {status:2}}, {multi: true});
创建复合唯一索引
db.video.createIndex({source_type:1,source:1,video_id:1,key_word:1},{name:\'idx_source_type_source_video_id_key_word\',unique:true});
--分组聚合
管道的概念
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
这里我们介绍一下聚合框架中常用的几个操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
db.getCollection(\'video\').aggregate([ { $group: { _id : \'$source\', count: { $sum : 1 } } }, { $match: { count: { $gt : 1} } } ])
db.getCollection(\'video\').aggregate([
{$project:{source : 1, source_type : 1,video_id:1,enter_time:1}},
{$match: {source:2,enter_time:{"$gte":ISODate(\'2020-03-22 07:42:58.675\') , "$lt":ISODate(\'2020-05-22 19:00:00.141\') },can_capture:{$ne:1}}},
{$group: { _id: {source : \'$source\', source_type : \'$source_type\',video_id:\'$video_id\'}, count: { $sum: 1 } }},
{$sort:{video_id:1}},
{$skip: 0 },
{$limit: 10 }
]);
注意:$peoject中,1-包含,0-不包含,_id 字段默认为包含
--查询与删除重复数据
db.video.aggregate([{ $group: { _id: { source: \'$source\', source_type: \'$source_type\', video_id: \'$video_id\', key_word: \'$key_word\' }, count: { $sum: 1 }, dups: { $addToSet: \'$_id\' } } }, { $match: { count: { $gt: 1 } } }]).forEach(function(doc) { doc.dups.shift(); db.video.remove({ _id: { $in: doc.dups } }); })
按日期分组统计
{ "collection": "video", "aggregate": [ { "$match": { "enter_time": { "$gte": { "$humanTime": "{{ StartDate }}" }, "$lt": { "$humanTime": "{{ EndDate }}" } } } }, { "$group": { "_id": { "$dateToString": { "format": "%Y-%m-%d", "date": "$enter_time", "timezone": "+0800" } }, "count": { "$sum": 1 } } } ] }
日期条件查询
db.video_comment_push_log.find({"source_type":4,"source":4}).sort({"_id":-1}).limit(2); db.video_comment.find({"source_type":4,"source":4,"enter_time":{"$gte":ISODate(\'2020-04-22 07:42:58.675\') , "$lt":ISODate(\'2020-04-22 19:00:00.141\') }}).count(); db.video_comment.find({"source_type":4,"source":4}).sort({"enter_time":-1}).limit(100); db.video_comment.count({"source_type":4,"source":4});
back
db.video_comment_push_log.find({"source_type":7,"source":2}).sort({"_id":-1}).limit(20); db.video_comment.find({"source_type":4,"source":4,"enter_time":{"$gte":ISODate(\'2020-04-22 03:00:00.114\') , "$lt":ISODate(\'2020-04-22 05:00:00.111\') }}).count(); db.video_comment.find({"source_type":4,"source":4}).sort({"enter_time":-1}).limit(100); db.video_comment.count({"source_type":4,"source":4}); db.video_push_log.find({"source_type":71,"source":2}).sort({"_id":-1}).limit(20); db.video.count({"source_type":4,"source":4,"enter_time":{"$gte":ISODate(\'2020-04-22 17:00:00.136\') , "$lt":ISODate(\'2020-04-23 06:00:00.098\') }}); db.teleplay_episode.count({"source_type":7,"source":2,"enter_time":{"$gte":ISODate(\'2020-04-21 00:00:00.208\') , "$lt":ISODate(\'2020-04-21 16:00:00.249\') }}); db.teleplay_comment.count({"source_type":7,"source":2,"enter_time":{"$gte":ISODate(\'1970-01-01 00:00:00.001\') , "$lt":ISODate(\'2020-04-22 06:00:00.156\') }});
redash查询mongo
{ "collection":"series_top_list", "query":{"code":"tengxunshipin"}, "$sort": [{"name": "ranking","direction": 1}] }
{ "collection":"risk_score", "aggregate":[ {"$group":{"_id":"$udid", "count":{"$sum":1}}}, {"$match":{"count":{"$gt":1}}}, {"$sort": [{"name": "count","direction": -1}]} ] }
安装部署(windows)
注意:使用的时候 请先在服务管理中 启动 MongoDB Server
常用命令行操作
1、显示当前数据库服务上的数据库
show dbs;
2、切换到指定的数据库进行操作
use mydb
3、显示当前数据库的所有集合(collections)
show collections;
4、查看数据库服务的状态
db.serverStatus();
5、查询指定数据库的统计信息
use admin
db.stat()
6、查询指定数据库包含的集合名称列表
use test1
db.getCollectionNames()
7、统计集合记录数
db.test1.count()
8、统计指定条件的记录数
db.test1.find({"name":"yunweicai"}).count()
9、查询指定数据库的集合当前可用的存储空间
db.test1.storageSize()
10、查询指定数据库的集合分配的存储空间
db.test1.totalSize()
参考资料:
Mongodb聚合框架Aggregate - 时间戳转时间聚合分组统计实现
学习MongoDB-应用举例(利用java操作MongoDB)
MongoDB查询大于某个时间,小于某个时间,在某一段时间范围
mongoTemplate.aggregate() 聚合查询,关联查询
mongoTemplate 聚合分组统计,aggregate分页
关于mongoDB使用java实现高级查询query参数的组装
以上是关于MongoDB学习记录的主要内容,如果未能解决你的问题,请参考以下文章