1、MongoDB的内置操作方法
1.1 查
1.1.1 比较运算查询
db.find() #查看所有文档记录
db.find().pretty()
db.findone({"_id":{"$ne":3}}) #只取匹配成功的第一个
比较运算:
= :{"_id":3}
!= : {"_id":{"$ne":3}}
> : {"_id":{"$gt":3}}
< : {"_id":{"$lt":3}}
<= : {"_id":{"$lte":3}}
>= : {"_id":{"$gte":3}}
eg:
#1、select * from db1.usesr where id=3
db.find({"_id":3})
#1、select * from db1.usesr where id!=3
db.user.find({"_id":{"$ne":3}})
1.1.2 逻辑运算
#逻辑运算:$and,$or,$not
#1 select * from db1.user where id >=3 and id <=4;
db.user.find({"_id":{"$gte":3,"$lte":4}})
#2 select * from db1.user where id >=3 and id <=4 and age >=40;
db.user.find({
"_id":{"$gte":3,"$lte":4},
"age":{"$gte":40} #结束就不要加逗号了
})
或者
db.user.find({"$and":[
{"_id":{"$gte":3,"$lte":4}}, #一个字典就是一个条件
{"age":{"$gte":40}}
]})
#3 select * from db1.user where id >=0 and id <=1 or id >=4 or name = "yuanhao";
db.user.find({"$or":[
{"_id":{"$lte":1,"$gte":0}},
{"_id":{"$gte":4}},
{"name":"yuanhao"}
]})
#4 select * from db1.user where id % 2 = 1; #奇数
db.user.find({"_id":{"$mod":[2,1]}}) #取模运算,id对2取模
#取反,偶数
db.user.find({
"_id":{"$not":{"$mod":[2,1]}}
})
1.1.3 成员运算
查询判断字段值是否在列表中
# MongoDB:"$in","$nin"
#1、select * from db1.user where age in (20,30,31);
db.user.find({"age":{"$in":[20,30,31]}})
#2、select * from db1.user where name not in ('huahua','xxx');
db.user.find({"name":{"$nin":['hauhua','xxx']}})
1.1.4 正则匹配
1.1.5 查看指定字段
1#查找表单中字段名称为country_brand的一列值,返回该列以及ObjectId
db.find({},{'country_brand':1})
2#正则表达式查找,并返回指定字段
db.find({
"name":/^jin.*?(g|n)$/i #//i,i代表忽略大小写,正则表达式匹配jin开头以及以g或者n结尾的
},
{
"name": 1 , #匹配显示该字段
"id": 0 , #匹配不显示该字段
})
1.1.6 排序
1.1.7 分页
1.1.8 获取数量
1.1.9 查询数组相关
#查询数组相关
db.user.find({ #查看有跳舞爱好的这些人,有就可以
"hobbies":"dancing"
})
db.user.find({ #既有喝茶爱好,又有跳舞爱好
"hobbies":{"$all":["dancing","tea"]}
})
db.user.find({ #第三个爱好是跳舞的
"hobbies.2":"dancing"
})
db.user.find( #查询所有人的后两个爱好
{}, #空就代表匹配到所有人了
{
"_id":0,
"name":0,
"age":0,
"addr":0,
"hobbies":{"$slice":-2}, #切最后一个到最后二个
}
)
db.user.find( #查询所有人的第一个和第二个爱好
{}, #空就代表匹配到所有人了
{
"_id":0,
"name":0,
"age":0,
"addr":0,
"hobbies":{"$slice":[1,2]}, #切第一个到第二个
}
)
db.user.find( #找前两个爱好
{},
{
"_id":0,
"name":0,
"age":0,
"addr":0,
"hobbies":{"$slice":2},
}
)
db.user.find( #找出国家是中国的
{
"addr.country":"China"
}
)
1.1.10 其他
1.2 改
1.2.1 更新部分字段
#设置:$set
通常文档只会有一部分需要更新。可以使用原子性的更新修改器,指定对文档中的某些字段进行更新。
更新修改器是种特殊的键,用来指定复杂的更新操作,比如修改、增加或者删除
#1、update db1.user set name="WXX" where id = 2
db.user.update({'_id':2},{"$set":{"name":"WXX"}})
#2、没有匹配成功则新增一条{"upsert":true}
db.user.update({'_id':6},{"$set":{"name":"egon","age":18}},{"upsert":true})
#3、默认只改匹配成功的第一条,{"multi":改多条}
db.user.update({'_id':{"$gt":4}},{"$set":{"age":28}})
db.user.update({'_id':{"$gt":4}},{"$set":{"age":38}},{"multi":true})
#4、修改内嵌文档,把名字为alex的人所在的地址国家改成Japan
db.user.update({'name':"alex"},{"$set":{"addr.country":"Japan"}})
#5、把名字为alex的人的地2个爱好改成piao
db.user.update({'name':"alex"},{"$set":{"hobbies.1":"piao"}})
#6、删除alex的爱好,$unset
db.user.update({'name':"alex"},{"$unset":{"hobbies":""}})
1.2.2 删除
#1、删除多个中的第一个
db.user.deleteOne({ 'age': 8 })
#2、删除国家为China的全部
db.user.deleteMany( {'addr.country': 'China'} )
#3、删除全部
db.user.deleteMany({})
1.2.3 数值的增加或减少
#增加和减少:$inc
#1、所有人年龄增加一岁
db.user.update({}, { "$inc":{"age":1}},{"multi":true} )
#2、所有人年龄减少5岁
db.user.update({}, { "$inc":{"age":-5}},{"multi":true} )
1.2.4 添加删除数组中的元素
#添加删除数组内元素 $push $pop $pull
往数组内添加元素:$push
#1、为名字为yuanhao的人添加一个爱好read
db.user.update({"name":"yuanhao"},{"$push":{"hobbies":"read"}})
#2、为名字为yuanhao的人一次添加多个爱好tea,dancing
db.user.update({"name":"yuanhao"},{"$push":{
"hobbies":{"$each":["tea","dancing"]}
}})
按照位置且只能从开头或结尾删除元素:$pop
#3、{"$pop":{"key":1}} 从数组末尾删除一个元素
db.user.update({"name":"yuanhao"},{"$pop":{
"hobbies":1}
})
#4、{"$pop":{"key":-1}} 从头部删除
db.user.update({"name":"yuanhao"},{"$pop":{
"hobbies":-1}
})
#5、按照条件删除元素,:"$pull" 把符合条件的统统删掉,而$pop只能从两端删
db.user.update({'addr.country':"China"},{"$pull":{
"hobbies":"read"}
},
{
"multi":true
}
)
1.2.5 slice的用法
#1、了解:限制大小"$slice",最后的结果只留最后n个
db.user.update({"_id":5},{
"$push":{"hobbies":{
"$each":["read",'music','dancing'],
"$slice":-2
}
}
})
#2、了解:排序The $sort element value must be either 1 or -1"
db.user.update({"_id":5},{
"$push":{"hobbies":{
"$each":["read",'music','dancing'],
"$slice":-1,
"$sort":-1
}
}
})
#注意:不能只将"$slice"或者"$sort"与"$push"配合使用,且必须使用"$eah"
1.3 聚合
MongoDB提供聚合框架,指可以使用多个构件创建一个管道,上一个构件的结果传给下一个构件。
这些构件包括(括号内为构件对应的操作符):筛选($match)、投射($project)、分组($group)、排序($sort)、限制($limit)、跳过($skip)不同的管道操作符可以任意组合,重复使用。
1.3.1 分组
# 分组$group
{"$group":{"_id":分组字段,"新的字段名":聚合操作符}}
eg:求每个部门的总工资
db.aggregate({"$group":{"_id":"$post","count":{"$sum":"$salary"}}})
1.3.2 筛选
#筛选$match
{"$match":{"字段":"条件"}},可以使用任何常用查询操作符$gt,$lt,$in等
eg:筛选ID>3的数据,求每个部门的平均工资
db.emp.aggregate(
{"$match":{"_id":{"$gt":3}}},
{"$group":{"_id":"$post",'avg_salary':{"$avg":"$salary"}}}
)
1.3.3 投射
#投射$project
{"$project":{"要保留的字段名":1,"要去掉的字段名":0,"新增的字段名":"表达式"}}
#1、select name,post,(age+1) as new_age from db1.emp;
db.emp.aggregate(
{"$project":{
"name":1,
"post":1,
"new_age":{"$add":["$age",1]}
}
})
#2、表达式之数学表达式
{"$add":[expr1,expr2,...,exprN]} #相加
{"$subtract":[expr1,expr2]} #第一个减第二个
{"$multiply":[expr1,expr2,...,exprN]} #相乘
{"$divide":[expr1,expr2]} #第一个表达式除以第二个表达式的商作为结果
{"$mod":[expr1,expr2]} #第一个表达式除以第二个表达式得到的余数作为结果
#3、表达式之日期表达式:$year,$month,$week,$dayOfMonth,$dayOfWeek,$dayOfYear,$hour,$minute,$second
#例如:select name,date_format("%Y") as hire_year from db1.emp
db.emp.aggregate(
{"$project":{"name":1,"hire_year":{"$year":"$hire_date"}}}
)
#例如查看每个员工的工作多长时间
db.emp.aggregate(
{"$project":{"name":1,"hire_period":{
"$subtract":[
{"$year":new Date()},
{"$year":"$hire_date"}
]
}}}
)
#4、字符串表达式
{"$substr":[字符串/$值为字符串的字段名,起始位置,截取几个字节]}
{"$concat":[expr1,expr2,...,exprN]} #指定的表达式或字符串连接在一起返回,只支持字符串拼接
{"$toLower":expr}
{"$toUpper":expr}
db.emp.aggregate( {"$project":{"NAME":{"$toUpper":"$name"}}})
#5、逻辑表达式
$and
$or
$not
其他见Mongodb权威指南
1.3.4 排序&限制&跳过
#排序$sort
{"$sort":{"字段名":1,"字段名":-1}} #1升序,-1降序
#限制$limit
{"$limit":n}
#跳过$skip
{"$skip":n}
2、pymongo交互操作
参考文献:http://www.cnblogs.com/haiyan123/p/8324180.html#_label4