MongoDB文档

MongoDB文档

以键值对的形成组成的一组数据

键与值
  • 键:文档的域,表达了一个键值对的含义
  • 值:即文档存储的数据
键的命名规则
  • utf-8格式字符串
  • 不能使用'\0'
  • 一个文档中的键不能重复
键值对的规则
  • 文档中键值对是有序的
  • 文档中键值对严格区分大小写

MongoDB数据类型

/*
类型                  值

整型                整数 1  2   3
布尔类型            true  false
浮点型              小数
Array               数组
Date                时间日期
Timestamp           时间戳
String              字符串
Symbol              特殊字符串
Binary data         二进制子串
Null                 null 空值
Object               内部文档(对象)
code                 js代码
regex                正则子串
ObjectId             自动生成ID标记
*/
ObjectId
  • 当mongodb插入文档时如果不指定_id域则自动生成_id
  • 值如果不自己指定即会自动生成一个ObjectId
  • ObjectId值:24位16进制,使用ObjectId经过算法处理保证其唯一性,8位文档创建时间 ,6位机器ID,4位进程id,6位计数器

集合中的文档

  • 集合中的文档不一定有相同的域
    • 个数不同
    • 域不相同
    • 数据类型不同
  • 集合中文档各自比较独立,相互并不影响
集合创建原则
  • 集合中的文档要描述同一类事物
  • 数据库中同一类数据尽量集中存放在相同的集合
  • 集合中的文档嵌套层数不要太多

插入文档

  • 插入操作中键可以不加引号
  • 查看插入结果 db.collection_name.find()
  • _id值可以自己插入,但是不能重复
/*
功能:插入一个文档
参数:要插入的文档
*/
db.collection.insert()
插入单个文档
// 插入单个文档
db.class0.insert({'name':'Lucy',"age":18,"sex":'w'})
db.class0.insert({_id:1,'name':'Jame',age:16,sex:'m'})

// 使用 insertOne()  插入单个文档
db.class0.insert({'name':'Lucy',"age":18,"sex":'w'})
插入多条文档

插入多条文档时,参数用中括号里面放入多个文档

// 插入多条文档
db.class0.insert([{name:"Alex",age:19,sex:'m'},{name:'Abby',age:18,sex:'w'}])

// 使用 insertMany()  插入多个文档
db.class0.insertMany([{name:"John",age:16,sex:'m'},{name:"Lenzer",age:17,sex:'m'}])
save插入文档
// 正常插入与insert用法相同
db.class0.save({name:'Allen',age:19,sex:'m'})
db.class0.save([{name:"Sunny",age:17,sex:'w'},{name:'Alice',age:16,sex:'w'}])

// 如果插入数据是有_id域,且_id域值存在时则会修改原有文档,如果该值不存在则正常插入
// 如果 _id = 2 存在的域存在,则覆盖之前的
db.class0.save({_id:2,name:'Mary',age:20,sex:'w'})
获取集合对象方法
db.class0  <===> db.getCollection('class0')

// 以下代码相当于 db.class0.find()
db.getCollection("class0").find()

删除文档

db.collection.remove(query,justOne)
/*
remove(query,justOne)
功能:删除文档
参数:query   删除条件
     justOne  布尔值 
              默认为false表示删除所有符合条件的文档
              设置为true则表示只删除一条
*/

// 删除所有不存在sex域的文档
db.class1.remove({sex:{$exists:false}})

// 删除第一条性别为w的文档
db.class1.remove({sex:'w'},true)

// 删除所有_id类型不是ObjectId类型的文档
db.class1.remove({_id:{$not:{$type:7}}})

// 删除集合中所有文档 db.collection.remove({})
// 删除class1中所有文档
db.class1.remove({})

修改文档

db.collection.update(query,update,upsert,multi)
/*
update(query,update,upsert,multi)
功能:修改文档
参数::
  query  筛选条件
  update  要修改成什么内容通常配合修改操作符 $set (修改器)使用
  upsert  布尔值
      默认是false 如果query没有筛选到文档则不做任何操作
      如果设置为true 则如果query没有筛选到匹配文档则根据query和update内容插入新的文档
  multi   布尔值 
      默认false 表示如果有多条符合条件文档则只修改第一条
      如果设置为true则表示修改所有符合条件文档
*/

// 将Tom的年龄修改为18
db.class0.update({name:'Tom'},{$set:{age:18}})

// 如果有name=Jason的文档则修改,如果没有则根据query update插入新的文档
db.class0.update({name:'Jason'},{$set:{age:24}},true)

// 修改所有年龄小于17的为18
db.class0.update({age:{$lt:17}},{$set:{age:18}},false,true)
修改操作符(修改器)
  • $set 修改一个域的值 / 增加一个域
// Lily年龄修改为17
db.class0.update({name:'Lily'},{$set:{age:17}})

// 为Jame增加sex域
db.class0.update({name:'Jame'},{$set:{sex:'m'}})
  • $unset 删除一个域
// 删除Abby的sex域,sex后为空字符串
db.class0.update({name:'Abby'},{$unset:{sex:''}})
  • $rename 修改域的名称
// 将sex域名改为gender,默认修改一个
db.class0.update({},{$rename:{sex:'gendar'}},false,true)
  • $setOnInsert
    如果使用update插入了文档,则将该修改器内容作为插入文档的一部分
// 如果插入了新文档则setOnInsert内容也会作为新文档一部分
db.class0.update({name:'Jame'},{$set:{age:18},$setOnInsert:{gendar:'m',tel:'1234545'}},true)
  • $inc 加法修改器
// 所有人年龄加1 
db.class0.update({},{$inc:{age:1}},false,true)
  • $mul 乘法修改器
// 参数可以是正数,负数,整数,小数
// 所有人年龄乘以0.5
db.class0.update({},{$mul:{age:0.5}},false,true)
  • $min
    如果筛选文档的指定域值小于min值则不修改,大于min值则修改为min
// Levi age如果大于20则修改为20
db.class0.update({name:'Levi'},{$min:age:20})
  • $max
    如果筛选文档的指定域值大于max值则不修改,小于max值则修改为max
数组修改器
db.class2.insert({name:'小红',age:9,score:[78,89]})
db.class2.insert({name:'小明',age:9,score:[88,89]})
db.class2.insert({name:'小刚',age:9,score:[88,75]})
db.class2.insert({name:'小乔',age:9,score:[97,92]})
  • $push 向数组中添加一项
// 给小红 score数组中添加一项91
db.class2.update({name:'小红'},{$push:{score:91}})
  • $pushAll 向数组中添加多项
// 给小乔 score数组中添加两项91,10
db.class2.update({name:'小乔'},{$pushAll:{score:[94,10]}})
  • $pull 从数组中删除一项
// 从小红 score数组中删除78
db.class2.update({name:'小红'},{$pull:{score:78}})
  • $pullAll 从数组中删除多项
// 从小乔 score数组中添加两项92,10
db.class2.update({name:'小乔'},{$pullAll:{score:[92,10]}})
  • $each 对多个值逐个进行操作
// 给小乔 score 分别插入99  10
db.class2.update({name:'小乔'},{$push:{score:{$each:[99,10]}}})
  • $position 指定插入位置,需配合$each使用
// 给小明 将67插入到数组1号位置
db.class2.update({name:'小明'},{$push:{score:{$each:[67],$position:1}}})
  • $sort 数组排序
// 将所有score域的数组降序排序
db.class2.update({},{$push:{score:{$each:[],$sort:-1}}},false,true)
  • $pop 弹出一项,1表示弹出最后一项,-1弹出第一项
// 删除小明score中第一项
db.class2.update({name:'小明'},{$pop:{score:-1}})
  • $addToSet 向数组中添加一项,但是不能添加重复的内容
// 给小刚 如果score数组中没有81 则添加81,如果有则报错
db.class2.update({name:'小刚'},{$addToSet:{score:81}})

你可能感兴趣的:(MongoDB文档)