mongodb基本使用

Posted 南辕北辙的天空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb基本使用相关的知识,希望对你有一定的参考价值。

一、mongodb简介

MongoDB是一个基于分布式文件存储的数据库,是介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

二、安装与配置

https://blog.csdn.net/congcong68/article/details/44277469

 

三、mongodb的增删改查

(一)数据库操作

1 use blog  #切换数据库,没有时会创建
3 show dbs    #查看所有的数据库(数据库必须有数据才会显示)
5 db.dropDatabase()   #删除数据库

(二)collection操作

集合就是相当于关系数据库中的表

1 use blog  #切换数据库
2 db.article.insert({title:python})  #创建集合article并插入数据,db指当前用的数据库
3 show tables    #查看集合(表)
4 db.article.drop()   #删除集合

(三)文档操作

文档相当于关系数据库中的记录

1、添加文档

1 user0 = {name:alex,...}
2 db.test.insert(user0)   #插入单条
3 user1 = {...}
4 user2 = {...}
5 user3 = {...}
6 db.test.insertMany([user1,user2,user3])   #插入多条

2、查看文档

 1 db.user.find()  #查看集合中所有文档
 2 db.user.find().pretty()  #格式化展示输出结果
 3 db.user.findOne()   #只取匹配成功的第一个
 4 
 5 db.user.find({相当于where条件},{相当于select条件})
 6 
 7 ###########比较运算##########
 8 $gt,$lt,$gte,$lte,$ne 分别代表大于、小于、大于等于、小于等于、不等于
 9 
10 db.user.find({name:alex})   #查询name等于alex的
11 
12 db.user.find({name:{"$ne":alex}})  # #查询name不等于alex的
13 
14 db.user.find({_id:{$gt:2}})   #id大于2的
15 
16 db.user.find({"_id":{"$gte":2,}})  #id大于等于2的
17 
18 
19 ###########逻辑运算##########
20 $or  或;$not 非;字典中多个条件用逗号分隔是and关系
21 
22 db.user.find({_id:{"$gte":2,"$lt":4}}  #id大于等于2,小于4的
23 db.user.find({"_id":{"$gte":2},"age":{"$lt":40}}) #id等于2,年龄小于40的
24 
25 db.user.find({"$or":[{_id:{"$gte":5}}, {"name":"alex"} ]})  #id大于等于5或name等于alex的
26 
27 db.user.find({_id:{"$mod":[2,1]}})  #id除以2余数为1的
28 
29 db.user.find({_id:{"$not":{"$mod":[2,1]}}})  #id除以2余数为1的 
30   取反
31 
32 ###########成员运算##########
33 db.user.find({age:{$in:[20,30,31]}})  #in
34 
35 db.user.find({age:{$nin:[20,30]}})    # not in 
36 
37 
38 ###########正则匹配##########
39 /正则表达式/i ,i表示模式
40 db.user.find({name:/^j.*?(g|n)$/i})  
41 
42 ###########取指定的字段##########
43 
44 db.user.find({_id:3},{‘‘name:1,age:1})  #1表示取,0表示不取
45 注意:{‘‘name:1,age:1},字典内要么都是1,要么都是0,不能既有1又有0,但是_id除外
46 
47 ###########查询数组##########
48 直接用点取值
49 
50 db.user.find({hobbies:dancing})  #查询hobbies对应列表中有dancing的人
51 db.user.find({"hobbies.3":tea})  #查询hobbies对应列表的第四个值为tea的
52 
53 db.user.find({},{hobbies:{"$slice":-2})#查询所有人最后两个爱好
54 
55 ###########排序##########
56 
57 db.user.find().sort({"age":-1,_id:1})  # 1代表升序,-1代表降序
58 
59 ###########分页##########
60 
61 db.user.find().sort({age:1}).limit(1).skip(2)  #limit代表取多少个,skip代表跳过前面多少个
62 
63 ###########统计数量##########
64 
65 db.user.count({age:{"$gt":30}})
66 或  db.user.find({age:{"$gt":30}}).count()
67 
68 ###########其他##########
69 {key:null} 匹配key的值为null或者没有这个key
70 
71 db.t2.find({"b":null})  #b为null或没有b的

3、更新文档

 1 ######### update()方法 #######
 2 
 3 对比update db1.t1 set name=EGON,sex=Male where name=egon and age=18;
 4 
 5 update() 方法用于更新已存在的文档。语法格式如下:
 6 db.collection.update(
 7    <query>,     //查询条件,相当于where
 8    <update>,    //update的对象和一些更新的操作符,相当于set
 9    {
10      upsert: <boolean>,  //可选,默认false,代表不存在update的记录不更新也不插入,设为true,表示插入
11      multi: <boolean>,    // 可选,默认false,代表只更新找到的第一条几录,设为true,代表更新全部
12      writeConcern: <document>  //可选,抛出异常的级别
13    }
14 )
 1 #########覆盖更新#######
 2 用新的文档替换匹配的文档
 3 db.user.update({age:20},{"name":"Wxx","hobbies_count":3})#是用{"_id":2,"name":"Wxx","hobbies_count":3}覆盖原来的记录
 4 
 5 #########局部更新#######
 6 只更新文档的一部分内容
 7 
 8 db.user.update({_id:6},{"$set":{"name":"egon","age":18}},{"upsert":true})   #没匹配成功会新插入一条
 9 
10 db.user.update({_id:{"$gt":4}},{"$set":{"age":38}},{"multi":true})   #更新多条
11 
12 #########自增自减#######
13 db.user.update({},{ "$inc":{"age":1}}, { "multi":true }) #所有人年龄加一岁
14 db.user.update({},{ "$inc":{"age":-1}}, { "multi":true })  #所有人年龄减一岁
15 
16 #########添加删除数组内的元素#######
17 添加删除数组内元素:$push,$pop,$pull
18 
19 #1、为名字为yuanhao的人添加一个爱好read
20 db.user.update({"name":"yuanhao"},{"$push":{"hobbies":"read"}})
21  
22 #2、为名字为yuanhao的人一次添加多个爱好tea,dancing
23 db.user.update({"name":"yuanhao"},{"$push":{
24     "hobbies":{"$each":["tea","dancing"]}
25 }})
26 
27 按照位置且只能从开头或结尾删除元素:$pop
28 #3、{"$pop":{"key":1}} 从数组末尾删除一个元素
29  
30 db.user.update({"name":"yuanhao"},{"$pop":{
31     "hobbies":1}
32 })
33  
34 #4、{"$pop":{"key":-1}} 从头部删除
35 db.user.update({"name":"yuanhao"},{"$pop":{
36     "hobbies":-1}
37 })
38 
39 #5、按照条件删除元素,:"$pull" 把符合条件的统统删掉,而$pop只能从两端删
40 db.user.update({addr.country:"China"},{"$pull":{
41     "hobbies":"read"}},{ "multi":true})
42 
43 #########避免重复添加#######
44 "$addToSet"
45 
46 db.urls.insert({"_id":1,"urls":[]})
47 
48 #下面只会添加一次
49 db.urls.update({"_id":1},{"$addToSet":{urls:http://baidu}})
50 db.urls.update({"_id":1},{"$addToSet":{urls:http://baidu}})

4、删除文档

1 #1、删除多个中的第一个
2 db.user.deleteOne({ age: 8 })
3  
4 #2、删除国家为China的全部
5 db.user.deleteMany( {addr.country: China} )
6  
7 #3、删除全部
8 db.user.deleteMany({}) 

 

四、在python中的使用---pymongo模块 

基本使用:

#插入单个文档
result = collection.insert(student)
print(result)

#插入多个文档
result = collection.insert([student1, student2])
print(result)

# 实际上在PyMongo 3.X版本中,insert()方法官方已经不推荐使用了,当然继续使用也没有什么问题,
# 官方推荐使用insert_one()和insert_many()方法将插入单条和多条记录分开。
 1 import pymongo
 2 
 3 client = pymongo.MongoClient(host=localhost,port=27017)
 4 
 5 #指定数据库
 6 db = client.blog
 7 print(db)
 8 #指定集合
 9 collection = db.user
10 #查询多个
11 # for el in collection.find():
12 #     print(el)
13 
14 #只返回查询到的第一个结果
15 # result = collection.find_one({‘age‘:{‘$gt‘:10}})
16 # print(result)
17 
18 
19 #使用正则查询
20 res = collection.find({name:{$regex:^w.*}})
21 # for el in res:
22 #     print(el)
23 
24 #计数
25 count = collection.find().count()
26 print(count)
27 
28 #排序  多个条件
29 ret = collection.find().sort([(name,pymongo.ASCENDING),(age,pymongo.DESCENDING)])
30 for el in ret:
31     print(el)
 1 #对于数据更新可以使用update()方法,指定更新的条件和更新后的数据即可
 2 condition = {name: Kevin}
 3 student = collection.find_one(condition)
 4 student[age] = 25
 5 result = collection.update(condition, student)
 6 print(result)
 7 
 8 #update()方法其实也是官方不推荐使用的方法,在这里也分了#update_one()方法和update_many()方法,用法更加严格,
 9 # 第二个参数需要使用$类型操作符作为字典的键名
10 condition = {name: Kevin}
11 student = collection.find_one(condition)
12 student[age] = 26
13 result = collection.update_one(condition, {$set: student})
14 print(result)
15 print(result.matched_count, result.modified_count)
16 # 在这里调用了update_one方法,第二个参数不能再直接传入修改后的字典,而是需要使用{‘$set‘: student}这样的形式,
17 # 其返回结果是UpdateResult类型,然后调用matched_count和modified_count属性分别可以获得匹配的数据条数和影响的数据条数。
18   
19 # 运行结果:
20 # <pymongo.results.UpdateResult object at 0x10d17b678>
21 # 1 0
22 
23 condition = {age: {$gt: 20}}
24 result = collection.update_many(condition, {$inc: {age: 1}})
25 print(result)
26 print(result.matched_count, result.modified_count)
27 # 这时候匹配条数就不再为1条了,运行结果如下:
28 #
29 # <pymongo.results.UpdateResult object at 0x10c6384c8>
30 # 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属性获取删除的数据条数。

关于$的其他功能符号:

# 在这里将一些功能符号再归类如下:
"""
符号含义示例示例含义
$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基本使用的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB PHP

mongodb关联查询

ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项

c_cpp Robolution基本代码片段

无法在 MongoDB(猫鼬)文档中追加数组

在 Spring MongoDB 的 ReplaceRoot 管道阶段使用 $mergeObjects