mongodb
简介
Mongodb 是目前最流行的 NoSQL 数据库之一。
CRUD
数据库操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | > use blog switched to db blog > show dbs admin 0.000GB config 0.000GB local 0.000GB test 0.000GB > db.article.insert({ "title" : "西游记" }) WriteResult({ "nInserted" : 1 }) > db.userinfo.insert({ "name" : "alex" }) WriteResult({ "nInserted" : 1 }) > show tables; article userinfo > show dbs admin 0.000GB blog 0.000GB config 0.000GB local 0.000GB test 0.000GB > db.dropDatabase() { "dropped" : "blog" , "ok" : 1 } |
集合操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | > use blog switched to db blog > db.article.insert( "title" : "python" ) 2018 - 09 - 10T11 : 14 : 02.017 + 0800 E QUERY [js] SyntaxError: missing ) after argument list @(shell): 1 : 25 > use blog switched to db blog > db.article.insert({ "title" : "python" }) WriteResult({ "nInserted" : 1 }) > db.article.insert({ "title" : "linux" }) WriteResult({ "nInserted" : 1 }) > show tables; article > db.article.drop() true > show tables; > |
文档操作
添加文档
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | #1、没有指定_id则默认ObjectId,_id不能重复,且在插入后不可变 #2、插入单条 user0 = { "name" : "egon" , "age" : 10 , 'hobbies' :[ 'music' , 'read' , 'dancing' ], 'addr' :{ 'country' : 'China' , 'city' : 'BJ' } } db.test.insert(user0) db.test.find() #3、插入多条 user1 = { "_id" : 1 , "name" : "alex" , "age" : 10 , 'hobbies' :[ 'music' , 'read' , 'dancing' ], 'addr' :{ 'country' : 'China' , 'city' : 'weifang' } } user2 = { "_id" : 2 , "name" : "wupeiqi" , "age" : 20 , 'hobbies' :[ 'music' , 'read' , 'run' ], 'addr' :{ 'country' : 'China' , 'city' : 'hebei' } } user3 = { "_id" : 3 , "name" : "yuanhao" , "age" : 30 , 'hobbies' :[ 'music' , 'drink' ], 'addr' :{ 'country' : 'China' , 'city' : 'heibei' } } user4 = { "_id" : 4 , "name" : "jingliyang" , "age" : 40 , 'hobbies' :[ 'music' , 'read' , 'dancing' , 'tea' ], 'addr' :{ 'country' : 'China' , 'city' : 'BJ' } } user5 = { "_id" : 5 , "name" : "jinxin" , "age" : 50 , 'hobbies' :[ 'music' , 'read' ,], 'addr' :{ 'country' : 'China' , 'city' : 'henan' } } db.user.insertMany([user1,user2,user3,user4,user5]) |
查看文档
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | <br> ###################### (1) 比较运算 ################################### # SQL:=,!=,>,<,>=,<= # MongoDB:{key:value}代表什么等于什么,"$ne","$gt","$lt","gte","lte",其中"$ne"能用于所有数据类型 #1、select * from db1.user where name = "alex"; db.user.find({ 'name' : 'alex' }) #2、select * from db1.user where name != "alex"; db.user.find({ 'name' :{ "$ne" : 'alex' }}) #3、select * from db1.user where id > 2; db.user.find({ '_id' :{ '$gt' : 2 }}) #4、select * from db1.user where id < 3; db.user.find({ '_id' :{ '$lt' : 3 }}) #5、select * from db1.user where id >= 2; db.user.find({ "_id" :{ "$gte" : 2 ,}}) #6、select * from db1.user where id <= 2; db.user.find({ "_id" :{ "$lte" : 2 }}) ###################### (2) 逻辑运算 ################################### # SQL:and,or,not # MongoDB:字典中逗号分隔的多个条件是and关系,"$or"的条件放到[]内,"$not" #1、select * from db1.user where id >= 2 and id < 4; db.user.find({ '_id' :{ "$gte" : 2 , "$lt" : 4 }}) #2、select * from db1.user where id >= 2 and age < 40; db.user.find({ "_id" :{ "$gte" : 2 }, "age" :{ "$lt" : 40 }}) #3、select * from db1.user where id >= 5 or name = "alex"; db.user.find({ "$or" :[ { '_id' :{ "$gte" : 5 }}, { "name" : "alex" } ] }) #4、select * from db1.user where id % 2=1; db.user.find({ '_id' :{ "$mod" :[ 2 , 1 ]}}) #5、上题,取反 db.user.find({ '_id' :{ "$not" :{ "$mod" :[ 2 , 1 ]}}}) ###################### (3) 成员运算 ################################### # SQL:in,not in # 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 ('alex','yuanhao'); db.user.find({ "name" :{ "$nin" :[ 'alex' , 'yuanhao' ]}}) ###################### (4) 正则匹配 ################################### # SQL: regexp 正则 # MongoDB: /正则表达/i #1、select * from db1.user where name regexp '^j.*?(g|n)$'; db.user.find({ 'name' : / ^j. * ?(g|n)$ / i}) ###################### (5) 取指定字段 ################################### #1、select name,age from db1.user where id=3; db.user.find({ '_id' : 3 },{ '_id' : 0 , 'name' : 1 , 'age' : 1 }) ###################### (6) 查询数组 ################################### #1、查看有dancing爱好的人 db.user.find({ 'hobbies' : 'dancing' }) #2、查看既有dancing爱好又有tea爱好的人 db.user.find({ 'hobbies' :{ "$all" :[ 'dancing' , 'tea' ] } }) #3、查看第4个爱好为tea的人 db.user.find({ "hobbies.3" : 'tea' }) #4、查看所有人最后两个爱好 db.user.find({},{ 'hobbies' :{ "$slice" : - 2 }, "age" : 0 , "_id" : 0 , "name" : 0 , "addr" : 0 }) #5、查看所有人的第2个到第3个爱好 db.user.find({},{ 'hobbies' :{ "$slice" :[ 1 , 2 ]}, "age" : 0 , "_id" : 0 , "name" : 0 , "addr" : 0 }) > db.blog.find().pretty() { "_id" : 1 , "name" : "alex意外死亡的真相" , "comments" : [ { "name" : "egon" , "content" : "alex是谁???" , "thumb" : 200 }, { "name" : "wxx" , "content" : "我去,真的假的" , "thumb" : 300 }, { "name" : "yxx" , "content" : "吃喝嫖赌抽,欠下两个亿" , "thumb" : 40 }, { "name" : "egon" , "content" : "xxx" , "thumb" : 0 } ] } db.blog.find({},{ 'comments' :{ "$slice" : - 2 }}).pretty() #查询最后两个 db.blog.find({},{ 'comments' :{ "$slice" :[ 1 , 2 ]}}).pretty() #查询1到2 ###################### (7) 排序 ################################### # 排序:--1代表升序,-1代表降序 db.user.find().sort({ "name" : 1 ,}) db.user.find().sort({ "age" : - 1 , '_id' : 1 }) ###################### (8) 分页 ################################### # 分页:--limit代表取多少个document,skip代表跳过前多少个document。 db.user.find().sort({ 'age' : 1 }).limit( 1 ).skip( 2 ) ###################### (9) 查询数量 ################################### # 获取数量 db.user.count({ 'age' :{ "$gt" : 30 }}) - - 或者 db.user.find({ 'age' :{ "$gt" : 30 }}).count() ###################### (10) 其它 ################################### #1、{'key':null} 匹配key的值为null或者没有这个key db.t2.insert({ 'a' : 10 , 'b' : 111 }) db.t2.insert({ 'a' : 20 }) db.t2.insert({ 'b' :null}) > db.t2.find({ "b" :null}) { "_id" : ObjectId( "5a5cc2a7c1b4645aad959e5a" ), "a" : 20 } { "_id" : ObjectId( "5a5cc2a8c1b4645aad959e5b" ), "b" : null } #2、查找所有 db.user.find() #等同于db.user.find({}) db.user.find().pretty() #3、查找一个,与find用法一致,只是只取匹配成功的第一个 db.user.findOne({ "_id" :{ "$gt" : 3 }}) |
更改文档
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | <br> ############################## 1 update的语法 ############################## update() 方法用于更新已存在的文档。语法格式如下: db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) 参数说明:对比update db1.t1 set name = 'EGON' ,sex = 'Male' where name = 'egon' and age = 18 ; query : 相当于where条件。 update : update的对象和一些更新的操作符(如$,$inc...等,相当于 set 后面的 upsert : 可选,默认为false,代表如果不存在update的记录不更新也不插入,设置为true代表插入。 multi : 可选,默认为false,代表只更新找到的第一条记录,设为true,代表更新找到的全部记录。 writeConcern :可选,抛出异常的级别。 更新操作是不可分割的:若两个更新同时发送,先到达服务器的先执行,然后执行另外一个,不会破坏文档。 ############################## 2 覆盖更新 ############################## #注意:除非是删除,否则_id是始终不会变的 #1 : db.user.update({ 'age' : 20 },{ "name" : "Wxx" , "hobbies_count" : 3 }) 是用{ "_id" : 2 , "name" : "Wxx" , "hobbies_count" : 3 }覆盖原来的记录 #2、一种最简单的更新就是用一个新的文档完全替换匹配的文档。这适用于大规模式迁移的情况。例如 var obj = db.user.findOne({ "_id" : 2 }) obj.username = obj.name + 'SB' obj.hobbies_count + + delete obj.age db.user.update({ "_id" : 2 },obj) ############################## 3 局部更新 ############################## #设置:$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" :""}}) ############################## 4 自增或自减 ############################## #增加和减少:$inc #1、所有人年龄增加一岁 db.user.update({}, { "$inc" :{ "age" : 1 } }, { "multi" :true } ) #2、所有人年龄减少5岁 db.user.update({}, { "$inc" :{ "age" : - 5 } }, { "multi" :true } ) ############################## 5 添加删除数组内元素 ############################## #添加删除数组内元素:$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 } ) ############################## 6 避免重复添加 ############################## #避免添加重复:"$addToSet" db.urls.insert({ "_id" : 1 , "urls" :[]}) db.urls.update({ "_id" : 1 },{ "$addToSet" :{ "urls" : 'http://www.baidu.com' }}) db.urls.update({ "_id" : 1 },{ "$addToSet" :{ "urls" : 'http://www.baidu.com' }}) db.urls.update({ "_id" : 1 },{ "$addToSet" :{ "urls" : 'http://www.baidu.com' }}) db.urls.update({ "_id" : 1 },{ "$addToSet" :{ "urls" :{ "$each" :[ 'http://www.baidu.com' , 'http://www.baidu.com' , 'http://www.xxxx.com' ] } } } ) ############################## 7 其它 ############################## #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 2 3 4 5 6 7 8 | #1、删除多个中的第一个 db.user.deleteOne({ 'age' : 8 }) #2、删除国家为China的全部 db.user.deleteMany( { 'addr.country' : 'China' } ) #3、删除全部 db.user.deleteMany({}) |
可视化工具
pymongo
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 | """ MongoDB存储 在这里我们来看一下Python3下MongoDB的存储操作,在本节开始之前请确保你已经安装好了MongoDB并启动了其服务,另外安装好了Python 的PyMongo库。 连接MongoDB 连接MongoDB我们需要使用PyMongo库里面的MongoClient,一般来说传入MongoDB的IP及端口即可,第一个参数为地址host, 第二个参数为端口port,端口如果不传默认是27017。 """ <br> import pymongo client = pymongo.MongoClient(host = 'localhost' , port = 27017 )<br> """ 这样我们就可以创建一个MongoDB的连接对象了。另外MongoClient的第一个参数host还可以直接传MongoDB的连接字符串,以mongodb开头, 例如:client = MongoClient('mongodb://localhost:27017/')可以达到同样的连接效果。<br> """ # 指定数据库 # MongoDB中还分为一个个数据库,我们接下来的一步就是指定要操作哪个数据库,在这里我以test数据库为例进行说明,所以下一步我们 # 需要在程序中指定要使用的数据库。 db = client.test # 调用client的test属性即可返回test数据库,当然也可以这样来指定: # db = client['test'] # 两种方式是等价的。 # 指定集合 # MongoDB的每个数据库又包含了许多集合Collection,也就类似与关系型数据库中的表,下一步我们需要指定要操作的集合, # 在这里我们指定一个集合名称为students,学生集合。还是和指定数据库类似,指定集合也有两种方式。 collection = db.students # collection = db['students'] # 插入数据,接下来我们便可以进行数据插入了,对于students这个Collection,我们新建一条学生数据,以字典的形式表示: student = { 'id' : '20170101' , 'name' : 'Jordan' , 'age' : 20 , 'gender' : 'male' } # 在这里我们指定了学生的学号、姓名、年龄和性别,然后接下来直接调用collection的insert()方法即可插入数据。 result = collection.insert(student) print (result) # 在MongoDB中,每条数据其实都有一个_id属性来唯一标识,如果没有显式指明_id,MongoDB会自动产生一个ObjectId类型的_id属性。 # insert()方法会在执行后返回的_id值。 # 运行结果: # 5932a68615c2606814c91f3d # 当然我们也可以同时插入多条数据,只需要以列表形式传递即可,示例如下: student1 = { 'id' : '20170101' , 'name' : 'Jordan' , 'age' : 20 , 'gender' : 'male' } student2 = { 'id' : '20170202' , 'name' : 'Mike' , 'age' : 21 , 'gender' : 'male' } result = collection.insert([student1, student2]) print (result) # 返回的结果是对应的_id的集合,运行结果: # [ObjectId('5932a80115c2606a59e8a048'), ObjectId('5932a80115c2606a59e8a049')] # 实际上在PyMongo 3.X版本中,insert()方法官方已经不推荐使用了,当然继续使用也没有什么问题, # 官方推荐使用insert_one()和insert_many()方法将插入单条和多条记录分开。 student = { 'id' : '20170101' , 'name' : 'Jordan' , 'age' : 20 , 'gender' : 'male' } result = collection.insert_one(student) print (result) print (result.inserted_id) # 运行结果: # <pymongo.results.InsertOneResult object at 0x10d68b558> # 5932ab0f15c2606f0c1cf6c5 # 返回结果和insert()方法不同,这次返回的是InsertOneResult对象,我们可以调用其inserted_id属性获取_id。 # 对于insert_many()方法,我们可以将数据以列表形式传递即可,示例如下: student1 = { 'id' : '20170101' , 'name' : 'Jordan' , 'age' : 20 , 'gender' : 'male' } student2 = { 'id' : '20170202' , 'name' : 'Mike' , 'age' : 21 , 'gender' : 'male' } result = collection.insert_many([student1, student2]) print (result) print (result.inserted_ids) # insert_many()方法返回的类型是InsertManyResult,调用inserted_ids属性可以获取插入数据的_id列表,运行结果: # <pymongo.results.InsertManyResult object at 0x101dea558> # [ObjectId('5932abf415c2607083d3b2ac'), ObjectId('5932abf415c2607083d3b2ad')] # 查询,插入数据后我们可以利用find_one()或find()方法进行查询,find_one()查询得到是单个结果,find()则返回多个结果。 result = collection.find_one({ 'name' : 'Mike' }) print ( type (result)) print (result) # 在这里我们查询name为Mike的数据,它的返回结果是字典类型,运行结果: # <class'dict'> # {'_id': ObjectId('5932a80115c2606a59e8a049'), 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'} # 可以发现它多了一个_id属性,这就是MongoDB在插入的过程中自动添加的。 # 我们也可以直接根据ObjectId来查询,这里需要使用bson库里面的ObjectId。 from bson.objectid import ObjectId result = collection.find_one({ '_id' : ObjectId( '593278c115c2602667ec6bae' )}) print (result) # 其查询结果依然是字典类型,运行结果: # {' ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'} # 当然如果查询_id':结果不存在则会返回None。 # 对于多条数据的查询,我们可以使用find()方法,例如在这里查找年龄为20的数据,示例如下: results = collection.find({ 'age' : 20 }) print (results) for result in results: print (result) # 运行结果: # <pymongo.cursor.Cursor object at 0x1032d5128> # {'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'} # {'_id': ObjectId('593278c815c2602678bb2b8d'), 'id': '20170102', 'name': 'Kevin', 'age': 20, 'gender': 'male'} # {'_id': ObjectId('593278d815c260269d7645a8'), 'id': '20170103', 'name': 'Harden', 'age': 20, 'gender': 'male'} # 返回结果是Cursor类型,相当于一个生成器,我们需要遍历取到所有的结果,每一个结果都是字典类型。 # 如果要查询年龄大于20的数据,则写法如下: results = collection.find({ 'age' : { '$gt' : 20 }}) # 在这里查询的条件键值已经不是单纯的数字了,而是一个字典,其键名为比较符号$gt,意思是大于,键值为20,这样便可以查询出所有 # 年龄大于20的数据。 # 在这里将比较符号归纳如下表: """ 符号含义示例 $lt小于{'age': {'$lt': 20}} $gt大于{'age': {'$gt': 20}} $lte小于等于{'age': {'$lte': 20}} $gte大于等于{'age': {'$gte': 20}} $ne不等于{'age': {'$ne': 20}} $in在范围内{'age': {'$in': [20, 23]}} $nin不在范围内{'age': {'$nin': [20, 23]}} """ # 另外还可以进行正则匹配查询,例如查询名字以M开头的学生数据,示例如下: results = collection.find({ 'name' : { '$regex' : '^M.*' }}) # 在这里使用了$regex来指定正则匹配,^M.*代表以M开头的正则表达式,这样就可以查询所有符合该正则的结果。 # 在这里将一些功能符号再归类如下: """ 符号含义示例示例含义 $regex匹配正则{'name': {'$regex': '^M.*'}}name以M开头 $exists属性是否存在{'name': {'$exists': True}}name属性存在 $type类型判断{'age': {'$type': 'int'}}age的类型为int $mod数字模操作{'age': {'$mod': [5, 0]}}年龄模5余0 $text文本查询{'$text': {'$search': 'Mike'}}text类型的属性中包含Mike字符串 $where高级条件查询{'$where': 'obj.fans_count == obj.follows_count'}自身粉丝数等于关注数 """ # 这些操作的更详细用法在可以在MongoDB官方文档找到: # https://docs.mongodb.com/manual/reference/operator/query/ # 计数 # 要统计查询结果有多少条数据,可以调用count()方法,如统计所有数据条数: count = collection.find().count() print (count) # 或者统计符合某个条件的数据: count = collection.find({ 'age' : 20 }).count() print (count) # 排序 # 可以调用sort方法,传入排序的字段及升降序标志即可,示例如下: results = collection.find().sort( 'name' , pymongo.ASCENDING) print ([result[ 'name' ] for result in results]) # 运行结果: # ['Harden', 'Jordan', 'Kevin', 'Mark', 'Mike'] # 偏移,可能想只取某几个元素,在这里可以利用skip()方法偏移几个位置,比如偏移2,就忽略前2个元素,得到第三个及以后的元素。 results = collection.find().sort( 'name' , pymongo.ASCENDING).skip( 2 ) print ([result[ 'name' ] for result in results]) # 运行结果: # ['Kevin', 'Mark', 'Mike'] # 另外还可以用limit()方法指定要取的结果个数,示例如下: results = collection.find().sort( 'name' , pymongo.ASCENDING).skip( 2 ).limit( 2 ) print ([result[ 'name' ] for result in results]) # 运行结果: # ['Kevin', 'Mark'] # 如果不加limit()原本会返回三个结果,加了限制之后,会截取2个结果返回。 # 值得注意的是,在数据库数量非常庞大的时候,如千万、亿级别,最好不要使用大的偏移量来查询数据,很可能会导致内存溢出, # 可以使用类似find({'_id': {'$gt': ObjectId('593278c815c2602678bb2b8d')}}) 这样的方法来查询,记录好上次查询的_id。 # 更新 # 对于数据更新可以使用update()方法,指定更新的条件和更新后的数据即可,例如: condition = { 'name' : 'Kevin' } student = collection.find_one(condition) student[ 'age' ] = 25 result = collection.update(condition, student) print (result) # 在这里我们将name为Kevin的数据的年龄进行更新,首先指定查询条件,然后将数据查询出来,修改年龄, # 之后调用update方法将原条件和修改后的数据传入,即可完成数据的更新。 # 运行结果: # {'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True} # 返回结果是字典形式,ok即代表执行成功,nModified代表影响的数据条数。 # 另外update()方法其实也是官方不推荐使用的方法,在这里也分了update_one()方法和update_many()方法,用法更加严格, # 第二个参数需要使用$类型操作符作为字典的键名,我们用示例感受一下。 condition = { 'name' : 'Kevin' } student = collection.find_one(condition) student[ 'age' ] = 26 result = collection.update_one(condition, { '$set' : student}) print (result) print (result.matched_count, result.modified_count) # 在这里调用了update_one方法,第二个参数不能再直接传入修改后的字典,而是需要使用{'$set': student}这样的形式, # 其返回结果是UpdateResult类型,然后调用matched_count和modified_count属性分别可以获得匹配的数据条数和影响的数据条数。 # 运行结果: # # <pymongo.results.UpdateResult object at 0x10d17b678> # 1 0 # 我们再看一个例子: condition = { 'age' : { '$gt' : 20 }} result = collection.update_one(condition, { '$inc' : { 'age' : 1 }}) print (result) print (result.matched_count, result.modified_count) # 在这里我们指定查询条件为年龄大于20,然后更新条件为{'$inc': {'age': 1}},执行之后会讲第一条符合条件的数据年龄加1。 # 运行结果: # # <pymongo.results.UpdateResult object at 0x10b8874c8> # 1 1 # 可以看到匹配条数为1条,影响条数也为1条。 # 如果调用update_many()方法,则会将所有符合条件的数据都更新,示例如下: condition = { 'age' : { '$gt' : 20 }} result = collection.update_many(condition, { '$inc' : { 'age' : 1 }}) print (result) print (result.matched_count, result.modified_count) # 这时候匹配条数就不再为1条了,运行结果如下: # # <pymongo.results.UpdateResult object at 0x10c6384c8> # 3 3 # 可以看到这时所有匹配到的数据都会被更新。 # 删除 # 删除操作比较简单,直接调用remove()方法指定删除的条件即可,符合条件的所有数据均会被删除,示例如下: result = collection.remove({ 'name' : 'Kevin' }) print (result) # 运行结果: # # {'ok': 1, 'n': 1} # 另外依然存在两个新的推荐方法,delete_one()和delete_many()方法,示例如下: result = collection.delete_one({ 'name' : 'Kevin' }) print (result) print (result.deleted_count) result = collection.delete_many({ 'age' : { '$lt' : 25 }}) print (result.deleted_count) # 运行结果: # <pymongo.results.DeleteResult object at 0x10e6ba4c8> # 1 # 4 # delete_one()即删除第一条符合条件的数据,delete_many()即删除所有符合条件的数据,返回结果是DeleteResult类型, # 可以调用deleted_count属性获取删除的数据条数。 # 更多 # 另外PyMongo还提供了一些组合方法,如find_one_and_delete()、find_one_and_replace()、find_one_and_update(), # 就是查找后删除、替换、更新操作,用法与上述方法基本一致。 # 另外还可以对索引进行操作,如create_index()、create_indexes()、drop_index()等。 # 详细用法可以参见官方文档:http://api.mongodb.com/python/current/api/pymongo/collection.html # 另外还有对数据库、集合本身以及其他的一些操作,在这不再一一讲解,可以参见 # 官方文档:http://api.mongodb.com/python/current/api/pymongo/ |