mongodb与python交互的基本操作

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值