MongoDB增删查改
8天学通MongoDB——第二天 细说增删查改
mongodb_修改器($inc/$set/$unset/$push/$pop/upsert
)
MongoDB基本命令用
insert
操作
1 | //创建一个集合 |
这里已经成功的写入了2条记录
如果需要批量插入,可以使用for
循环语句来插入1
2
3
4
5
6
7
8
9//删除所有记录
db.students.remove("");
for(var i=1; i<=10; i++){
var student = {"sno":i,"sname":"s"+i,age:i,"course":["chinese","math"]};
db.students.insert(student);
}
db.students.find();
save()
函数可以添加数据,添加的列随意指定,如果调用了集合中默认的主键_id
,则会进行更新操作1
2
3
4
5
6//插入新数据
db.students.save({sno:123,sname:"ss",age:15});
//更新数据
var student = db.students.findOne();
student.age = 11;
db.students.save(student);
select
操作
操作符对应 >
为$gt
,>=
为$gte
,<
为$lt
,<=
为$lte
,!=
为$ne
关系连接符对应 or
为$or
, in
为$in
, not in
为$nin
1 | //默认每页显示20条记录,如果需要下一页使用it命令 |
group
操作
group
主要的参数:key
: 需要分组的属性initial
: 每组都分享一个”初始化函数“,特别注意:是每一组,比如这个的age=20的value的list分享一个?$reduce
: 这个函数的第一个参数是当前的文档对象,第二个参数是上一次function操作的累计对象,第一次为initial
中的{“students”:[]}。有多少个文档, $reduce
就会调用多少次initial
函数,age=22同样也分享一个initial
函数condition
: 过滤条件finalize
: 这是个函数,每一组文档执行完后,多会触发此方法,那么在每组集合里面加上count也就是它的活了1
2
3
4
5
6
7
8
9
10
11db.students.group({
"key": {"age":true},
"initial": {"students":[]},
"$reduce": function(cur,prev){
prev.students.push(cur.sname);
},
"condition": {"age":{$gte:10}},
"finalize": function(out){
out.count = out.students.length;
}
});
执行的部分结果为:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34[
{
"age" : 11,
"students" : [
"s1",
"s2"
],
"count" : 2
},
{
"age" : 12,
"students" : [
"s5",
"s3",
"s4"
],
"count" : 3
},
{
"age" : 14,
"students" : [
"s9",
"s10"
],
"count" : 2
},
{
"age" : 15,
"students" : [
"ss"
],
"count" : 1
}
]
Map-Reduce
操作
mapReduce
其实是一种编程模型,用在分布式计算中,其中有一个map
函数,这个称为映射函数,里面会调用emit(key,value)
,集合会按照你指定的key进行映射分组。reduce
函数为简化函数,会对map分组后的数据进行分组简化,注意:在reduce(key,value)
中的key就是emit中的key,vlaue为emit分组后的emit(value)的集合,这里也就是很多{“count”:1}的数组mapReduce
则为最后的执行函数1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20db.students.mapReduce(
//map
function(){
emit(this.age, {count:1});
},
//reduce
function(key, value){
var result = {count: 0};
for(var i=0; i<value.length; i++){
result.count += value[i].count;
}
return result;
},
{
"query": {"sname":/^s/},
"out": "collection"
}
);
db.collection.find();
执行结果为1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19{
"result" : "collection", //存放的集合名
"timeMillis" : 514,
"counts" : {
"input" : 11, //传入文档的个数
"emit" : 11, //此函数被调用的次数
"reduce" : 3, //此函数被调用的次数?
"output" : 7 //最后返回文档的个数
},
"ok" : 1
}
> db.collection.find();
{ "_id" : 6, "value" : { "count" : 1 } }
{ "_id" : 7, "value" : { "count" : 1 } }
{ "_id" : 8, "value" : { "count" : 1 } }
{ "_id" : 11, "value" : { "count" : 2 } }
{ "_id" : 12, "value" : { "count" : 3 } }
{ "_id" : 14, "value" : { "count" : 2 } }
{ "_id" : 15, "value" : { "count" : 1 } }
游标查询
1 | var cursor = db.students.find(); |
索引
1 | //创建索引 |
update
操作
1 | //$set即可对指定属性进行修改 |
其他操作
explain
函数可以用来性能分析1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17> db.students.find().explain();
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 11,
"nscannedObjects" : 11,
"nscanned" : 11,
"nscannedObjectsAllPlans" : 11,
"nscannedAllPlans" : 11,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"server" : "Ezio-Hu:27017",
"filterSet" : false
}
部分参数说明cursor
: BasicCursor
这里的查找采用的是“表扫描”,也就是顺序查找nscanned
: 数据库浏览的文档数目n
: 最终返回的文档数millis
: 查询耗时
tojson
: 将一个对象转换成json格式的对象1
tojson(new Object('student'))
printjson
: 将获取的对象输出json格式