/*db.col.insert({title:'test'})
db.col.find()
var doc=db.col.insertOne({a:1})
doc
var res=db.col.insertMany([{a:1},{b:2}])
res*/
/*db.col.insert({
title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
db.col.find()
db.col.update({title:'MongoDB 教程'},{$set:{'title':'MongoDB'}})
db.col.find().pretty()
以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
save() 方法通过传入的文档来替换已有文档
db.col.save({
"_id" : ObjectId("5a39f9e652378f342829b791"),
"title" : "MongoDB",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "Runoob",
"url" : "http://www.runoob.com",
"tags" : [
"mongodb",
"NoSQL"
],
"likes" : 110
})
db.col.find().pretty()*/
/*db.collection.updateOne() 向指定集合更新单个文档
db.collection.updateMany() 向指定集合更新多个文档*/
/*db.col.remove({title:"test"})//过时
如删除集合下全部文档:
db.inventory.deleteMany({})
删除 status 等于 A 的全部文档:
db.inventory.deleteMany({ status : "A" })
删除 status 等于 D 的一个文档:
db.inventory.deleteOne( { status: "D" } )*/
/*db.col.find().pretty()
等于
{:}
db.col.find({"by":"菜鸟教程"}).pretty()
where by = '菜鸟教程'
小于
{:{$lt:}}
db.col.find({"likes":{$lt:50}}).pretty()
where likes < 50
小于或等于
{:{$lte:}}
db.col.find({"likes":{$lte:50}}).pretty()
where likes <= 50
大于
{:{$gt:}}
db.col.find({"likes":{$gt:50}}).pretty()
where likes > 50
大于或等于
{:{$gte:}}
db.col.find({"likes":{$gte:50}}).pretty()
where likes >= 50
不等于
{:{$ne:}}
db.col.find({"likes":{$ne:50}}).pretty()
where likes != 50*/
/*MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
语法格式如下:
>db.col.find({key1:value1, key2:value2}).pretty()*/
/*MongoDB or
db.col.find({$or:[{title:'1'},{title:'MongoDB'}]})*/
/*db.col.find({likes:{$gte:100},$or:[{title:"1"},{title:"MongoDB"}]})//and 和or*/
/*返回指定的键若不指定 projection,则默认返回所有键,指定 projection 格式如下,有两种模式
db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的键,不返回其他键
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的键,返回其他键*/
/*_id 键默认返回,需要主动指定 _id:0 才会隐藏
两种模式不可混用(因为这样的话无法推断其他键是否应返回)
db.collection.find(query, {title: 1, by: 0}) // 错误
只能全1或全0,除了在inclusion模式时可以指定_id为0
db.collection.find(query, {_id:0, title: 1, by: 1}) // 正确*/
/*$gt -------- greater than >
$gte --------- gt equal >=
$lt -------- less than <
$lte --------- lt equal <=
$ne ----------- not equal !=
$eq -------- equal =*/
/*
$type
Double
1
String
2
Object
3
Array
4
Binary data
5
Undefined
6
已废弃。
Object id
7
Boolean
8
Date
9
Null
10
Regular Expression
11
JavaScript
13
Symbol
14
JavaScript (with scope)
15
32-bit integer
16
Timestamp
17
64-bit integer
18
Min key
255
Query with -1.
Max key
127
*/
/*db.col.find({"title" : {$type : 2}})//title为 String的数据 */
/*db.col.find({},{"title":1,_id:0}).limit(3)//limit数据条数
补充说明skip和limit方法只适合小数据量分页,如果是百万级效率就会非常低,因为skip方法是一条条数据数过去的,建议使用where_limit
在查看了一些资料之后,发现所有的资料都是这样说的:
不要轻易使用Skip来做查询,否则数据量大了就会导致性能急剧下降,这是因为Skip是一条一条的数过来的,多了自然就慢了。
这么说Skip就要避免使用了,那么如何避免呢?首先来回顾SQL分页的后一种时间戳分页方案,这种利用字段的有序性质,利用查询来取数据的方式,可以直接避免掉了大量的数数。也就是说,如果能附带上这样的条件那查询效率就会提高,事实上是这样的么?我们来验证一下:
这里我们假设查询第100001条数据,这条数据的Amount值是:2399927,我们来写两条语句分别如下:
b.test.sort({"amount":1}).skip(100000).limit(10) //183ms
db.test.find({amount:{$gt:2399927}}).sort({"amount":1}).limit(10) //53ms
结果已经附带到注释了,很明显后者的性能是前者的三分之一,差距是非常大的。也印证了Skip效率差的理论。*/
/*db.col.find({},{"title":1,_id:0}).sort({"likes":-1})//排序
*/
/*索引*/
/*db.col.ensureIndex({"title":1})//建索引按title升序
db.col.ensureIndex({"title":1,"description":-1})//建索引按title升序 descriptrion 降序
db.col.ensureIndex({open: 1, close: 1}, {background: true})*/
/*db.col.getIndexes()//查看索引
db.col.totalIndexSize()//查看集合中的索引大小*/
/*聚合*/
/*db.page.find({})
db.page.aggregate(
[
{$group : {
_id : "$pageTitle" ,
num : {
$sum : 1
}
}
}
]
)
*/
//查看不同 pageTile count
/*db.page.aggregate(
{ $project : {
title : 1 ,
author : 1 ,
}}
);
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );*/
//$match用于获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。
/*$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
$limit:用来限制MongoDB聚合管道返回的文档数。
$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
$group:将集合中的文档分组,可用于统计结果。
$sort:将输入文档排序后输出。
$geoNear:输出接近某一地理位置的有序文档。*/
//查看12点到2点之间errRank每个类别的数量
/*db.LogInfo.aggregate(
[
{
$match :
{
"createDate" :
{
$gt:ISODate("2018-01-04 16:00:00"),$lt:ISODate("2018-01-04 24:00:00")
}
}
},
{
$group:
{
_id:"$errRank", num:{ $sum : 1 }
}
}
]
)*/
/*查按日、按月、按年、按周、按小时、按分钟聚合操作如下:
db.getCollection('m_msg_tb').aggregate(
[
{$match:{m_id:10001,mark_time:{$gt:new Date(2017,8,0)}}},
{$group: {
_id: {$dayOfMonth:'$mark_time'},
pv: {$sum: 1}
}
},
{$sort: {"_id": 1}}
])
时间关键字如下:
$dayOfYear: 返回该日期是这一年的第几天(全年 366 天)。
$dayOfMonth: 返回该日期是这一个月的第几天(1到31)。
$dayOfWeek: 返回的是这个周的星期几(1:星期日,7:星期六)。
$year: 返回该日期的年份部分。
$month: 返回该日期的月份部分( 1 到 12)。
$week: 返回该日期是所在年的第几个星期( 0 到 53)。
$hour: 返回该日期的小时部分。
$minute: 返回该日期的分钟部分。
$second: 返回该日期的秒部分(以0到59之间的数字形式返回日期的第二部分,但可以是60来计算闰秒)。
$millisecond:返回该日期的毫秒部分( 0 到 999)。
$dateToString: { $dateToString: { format: , date: } }。*/
//MongoDB 复制(副本集)mongod --port 27017 --dbpath "/data/db" --replSet rs0
/* for(var i=0;i<150;i++){
db.getCollection("page").insert([
{
"pageTitle": "Java虚拟机运行时数据区域",
"pageContent":i,
"imageAddr": i,
"pageContentAddr":i,
"insertTime": new Date(),
"updateTime": new Date()
}
])
}
db.page.deleteMany({})*/
var s=db.rtdpRequestInfo.find(
{
"time" :
{
$gte:ISODate("2018-01-30 16:00:00"),$lte:ISODate("2018-01-31 16:00:00")
},
"range":{"$nin":["Avg","Avg Min","Avg Max"]},
$or:[{server:'XX.X.XXX.XXX'},{server:'XX.X.XXX.XXX'}]
}
)
var reduce = function(key, values){
var count=0;
values.forEach(function(v) {
count+=v.transaction;
});
return {count: count};
};
reduce("transaction",s)