MongoDB

Posted 嗯姆嗯姆嗯姆

tags:

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

MongoDB

1. MongoDB之原生ORM

使用了不存在的对象即创建该对象 **不存在关系链接**

不存在SQL语句nosql

格式:
  [{
id:1
name:"蔡文姬"
age: 16
gender:"女"
},
{
id:1
name:"蔡文姬"
age: 16
sex:["女","girl","老阿姨"]
other:{
hobby:["男","boy","小哥哥"]
}
}]

 

1. 首先创建一个数据库
use SS2Day4 穿件数据库并使用该数据库
db 显示当前使用的数据库
db.users  创建并使用Collection(表)

2. 增查改删(insert find update remove)
插入:
db.users.insert({"name":"蔡文姬","age":16}) # 建议不要使用 不推荐使用

查询:
db.users.find() #无条件查找:将该表(Collection)中所有的数据一次性返回
更新:
db.users.update({"name":"蔡文姬"},{$set:{"age":18}})# 建议不要使用 不推荐使用
删除:
db.users.remove({"age":21}) # 建议不要使用 不推荐使用
       remove({"name":"DragonFire"}) : 条件删除name等于"DragonFire"的所有Document

-------------------------------------------------------------------------------
table Collections
row Documents 数据条目
column Field 字段(key值)

2.MongoDB 数据类型

数据类型:
?
(1)Object  ID :Documents 自生成的 _id
   
   Object ID :Documents 自生成的 _id 并且 不支持转换成JSON字符串
?:{"_id" : ObjectId("5bda5293c6c72e52ffc7e91e")}
ObjectId:"5bda5293c6c72e52ffc7e91e"
0-8字节是时间戳,
9-14字节的机器标识符,表示MongoDB实例所在机器的不同;
15-18字节的进程id,表示相同机器的不同MongoDB进程。
19-24字节是计数器
        #以上四种标识符拼凑成世界上唯一的ObjectID
#只要是支持MongoDB的语言,都会有一个或多个方法,对ObjectID进行转换
#可以得到以上四种信息
?
#注意:这个类型是不可以被JSON序列化的
?
(2)String: 字符串,必须是utf-8
?
(3)Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写)
?
(4)Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
?
(5)Double:浮点数 (没有float类型,所有小数都是Double)
?
(6)Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦)
?
  {
       "_id" : ObjectId("5b163830993ddc4cd4918ead"),
       "name" : "LuffyCity",
       "teacher" : [
           "DragonFire",
           "WuSir2B",
           "Alex AGod"
      ]
  }
?
(7)Object:如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典
?
  {
       "_id" : ObjectId("5b163915993ddc4cd4918eaf"),
       "name" : "LuffyCity",
       "course" : {
           "name" : "Python",
           "price" : 19800
      }
  }
?
(8)Null:空数据类型 , 一个特殊的概念,None Null
?
(9)Timestamp:时间戳
?
  {
       "_id" : ObjectId("5b163bbf993ddc4cd4918eb3"),
       "name" : "LuffyCity",
       "date" : 1528183743111
  }
?
(10)Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
?
  {
       "_id" : ObjectId("5b163ba1993ddc4cd4918eb2"),
       "name" : "LuffyCity",
       "date" : ISODate("2018-06-05T15:28:33.705+08:00")
  }

 

3. 增删改查支持方式

insert:
db.users.insertMany([{"name":"王三"},{"name":"王舞"}])  # 插入多条
   db.user.insertOne({"name":"刘老师"})  # 插入一条
?
   
   
remove:
   #remove({}):无条件删除数据,这里要注意了,这是删除所有数据,清空Collection
   db.users.deleteOne({"age":63})
   db.users.deleteMany({"age":30})
?
   
   
update:
  ({"条件"},{"关键字":{"修改内容"}})
   如果条件为空,那么将会修改Collection中所有的数据
   
updateOne({"age":19},{$set:{"name":"WSSB"}}):根据条件修改一条数据的内容,如出现多条,只修改最高前的数据
updateMany({"age":19},{$set:{"name":"pig_qi"}}):根据条件修改所有数据的内容,多条修改
?
把age等于19的所有数据中的name改为WSSB
?
?
?
find:
   没有findMany
db.users.find({})
   
db.users.findOne({})  
   db.user.findOne({"name":"王舞"})
   #findOne()无条件查找一条数据,默认当前Collection中的第一条数据
   #一条数据转为 json格式

 

4. 数学比较符

$lt: <
$lte: <=
$gt: >
$gte: >=
$eq: ==
: : == or =  "name":"王舞" name=王舞

 

5. $

    "$"  update 加上关键字 变成了 修改器
   其实 "$" 字符 独立出现也是有意义的 , 我起名叫做代指符
?
   存储满足条件的数据下标索引位置(满足查询条件一条数据下标索引)
db.users.updateOne({"other.name":"linux","name":"银网吧"},{$set:{"other.$.score":19}})
  $定位不到第二层
弊端:[
[1,2,3],
[{k:{zk:zv}},{k2:v2},{k3:v3}],
[4,5,6],
]
深度查询查询速度慢(建议最大4层)

 

6. $关键字 查询

$or : db.users.find({$or:[{age:18},{name:"银网吧"}]})

$and : ,  (一般不用)

$in : db.users.find({age:{$in:[18,84,73]}})

$all : db.users.find({hobby:{$all:[1,2,3,4,5,6]}})
   查询条件必须包含在列表里([1,2,3]可以,[2,3,4,5,7]不行)

 

7. $修改器 update

$set: 
   直接将字段的值设定为value
?
$unset:
   删除字段(用来删除Key(field)的)
?
$inc:
   将查询到的结果 加上某一个值 然后保存
   原值增加 db.users.updateMany({name:"金王吧"},{$inc: {cursors: 1}})
   db.users.updateMany({name:"金王吧"},{$inc: {cursors: -10}})

 

8. $array 修改器

$push :
  它是用来对Array (list)数据类型进行 增加 新元素的,相当于Python中 list.append() 方法
append(item) db.users.updateMany({name:"金王吧"},{$push: {hobby:10}})
?
$pull :
   有了$push 对Array类型进行增加,就一定有办法对其内部进行删减,$pull 就是指定删除Array中的某一个元素
remove(item) db.users.updateMany({name:"金王吧"},{$pull: {hobby:10}})
?
$pop :
   指定删除Array中的第一个 最后一个 元素
pop() db.users.updateMany({name:"金王吧"},{$pop: {hobby:-1}})  1最后一个 -1第一个
  {$pop:{"test_list" : -1}}  -1 代表最前面, 1 代表最后边 (这和Python正好相反)

 

9.Array Object 的特殊操作

建立一条数据包含array object
?
{
   "_id" : ObjectId("5b17d01a49bf137b585df891"),
   "name" : "骑士计划",
   "price" : [
       19800,
       19500,
       19000,
       18800
  ],
   "other" : {
       "start" : "2019年11月1日",
       "start_time" : "09:30",
       "count" : 150
  }
}
?
(1) 把price 中的 19000 改为 19300
db.users.update({"name":"骑士计划"},{$set:{"price.2":19300}})
这里引用了下标的方法更改数值,"price.2"代指Array中的第三个元素
?
(2)如果price.1 中小于19800 则加200
db.users.update({"name":"骑士计划","price":{$lt:19500}},{$inc:{"price.$":200}})
?
(3)把other中 count 改为 199
db.users.update({"name":"骑士计划"},{$set:{"other.count":199}})
?
对了就是在这个对象 打点儿 key 就可以更改数值了 , 要注意的是, 咱们用的 $set 进行修改的,那么就意味着,如果没有"other.count"这个field的话,他会自动创建
?
?
(4)如果 count 小于 200 那么 10
db.users.update({"name":"骑士计划","other":{$lt:200}},{$inc:{"other.count":10}})
?
Array + Object 的用法 
{
   "_id" : ObjectId("5b17de9d44280738145722b9"),
   "name" : "骑士计划",
   "price" : [
      {
           "start" : "2018年8月1日",
           "start_time" : "08:30",
           "count" : 150
      },
      {
           "start" : "2018年8月2日",
           "start_time" : "09:30",
           "count" : 160
      },
      {
           "start" : "2018年8月3日",
           "start_time" : "10:30",
           "count" : 170
      },
      {
           "start" : "2018年8月4日",
           "start_time" : "11:30",
           "count" : 180
      }
  ]
}
?
(1)把count 大于 175 的field  15
db.users.update({"price.count":{$gt:175}},{$inc:{"price.$.count":15}})
?
(2) count 大于 180 start 改为 "2018年8月10日"
db.users.update({"price.count":{$gt:180}},{$set:{"price.$.start":"2017年8月10日"}})

10. Limit选取 Skip跳过 Sort排序

(1)limit : 
   db.users.find({}).limit(2) 显示条目数量
   limit(2) 就是选取两条Document(数据条目), 从整个Collection的第一条 Document 开始选取两条
?
(2)skip :跳过  db.users.find({}).skip(1) 跳过条目数量
    skip(2) 就是跳过两条Document, 从整个Collection 的第一条 Document 开始跳,往后跳两条
   
(3)简单分页(limit+skip)
   db.users.find({}).limit(当前页码*每页条目).skip(每页条目)
?
(4)Sort 排序 : 将结果按照关键字排序
  db.users.find({}).sort({ "price":1 })     1:ASC -1:DESC
   按照 price 字段进行升序 , 1 为升序 , -1 为降序
?
(5) 分页排序多重用法 Limit + Skip + Sort:
db.users.find({}).sort({ age:-1 }).limit(2).skip(2)
?
***重点 : Sort + Skip + Limit 是有执行优先级的 他们的界别分别是
          优先 Sort  其次 Skip 最后 Limt
?
Skip + Limit 的优先级 也是先 Skip Limit**

 

11. python 操作MongoDB

安装 pymongo
?
import pymongo
mongo = pymongo.MongoClient("127.0.0.1",27017)
MONGODB = mongo["SS2DAY04"]

增删改查

1.查(find find_one)
result = list(MONGODB.users.find({}))
 for item in result:
    print(item)
 print(result)
?
result_one = MONGODB.users.find_one({})
?
?
2. (insert_one insert_many)
res = MONGODB.student.insert_one({"name":"yd","nickname":"wl"})
print(res.inserted_id,type(res.inserted_id))
res = MONGODB.student.insert_many([{"name":"yd","nickname":"wl"},     {"name":"wpq","nickname":"cb"},{"name":"lj","nickname":"dsb"}])
?
print(res.inserted_ids)
?
3. 删(remove  delete_one delete_many)
# MONGODB.student.remove({})
# MONGODB.student.delete_one({"name":"yd"})
# MONGODB.student.delete_many({"name":"yd"})
?
4. (update update_one update_many)
# MONGODB.student.update({"name":"yd"})
# MONGODB.student.update_one({"name":"wpq"},{"$set":{"nickname":"peppa pig"}})
# MONGODB.student.update_many({},{"$set":{"age":84}})
?
5. 分页
res = MONGODB.users.find({}).sort("age",pymongo.ASCENDING).limit(2).skip(0)
for i in res:
    print(i)
# 删:
# MONGODB.student.delete_many({}) #清除数据
# MONGODB.student.drop()   # 删除表格

 

以上是关于MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

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

mongodb关联查询

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

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

如何创建一个查询来查找 2 个数字之间的值,这些数字是 MongoDB 中的字符串类型

MongoDB GridFS