mongodb
mongdb的优势
- 易扩展:\color{red}{易扩展:}易扩展: NoSQL数据库种类繁多,但是⼀个共同的特点都是去掉关系数据库的关系型特性。 数据之间⽆关系, 这样就⾮常容易扩展
- ⼤数据量,⾼性能:\color{red}{⼤数据量, ⾼性能:}⼤数据量,⾼性能: NoSQL数据库都具有⾮常⾼的读写性能, 尤其在⼤数据量下, 同样表现优秀。 这得益于它的⽆关系性, 数据库的结构简单
- 灵活的数据模型:\color{red}{灵活的数据模型:}灵活的数据模型: NoSQL⽆需事先为要存储的数据建⽴字段,随时可以存储⾃定义的数据格式。 ⽽在关系数据库⾥, 增删字段是⼀件⾮常麻烦的事情。 如果是⾮常⼤数据量的表, 增加字段简直就是⼀个噩梦
mongodb数据类型
- Object ID: ⽂档ID
- String: 字符串, 最常⽤, 必须是有效的UTF-8
- Boolean: 存储⼀个布尔值, true或false
- Integer: 整数可以是32位或64位, 这取决于服务器
- Double: 存储浮点值
- Arrays: 数组或列表, 多个值存储到⼀个键
- Object: ⽤于嵌⼊式的⽂档, 即⼀个值为⼀个⽂档
- Null: 存储Null值
- Timestamp: 时间戳, 表示从1970-1-1到现在的总秒数
- Date: 存储当前⽇期或时间的UNIX时间格式
创建⽇期语句如下 :参数的格式为YYYY-MM-DD
new Date(‘2017-12-20’) - 注意点
每个⽂档都有⼀个属性, 为_id, 保证每个⽂档的唯⼀性
可以⾃⼰去设置_id插⼊⽂档,如果没有提供, 那么MongoDB为每个⽂档提供了⼀个独特的_id, 类型为objectID
objectID是⼀个12字节的⼗六进制数:
前4个字节为当前时间戳
接下来3个字节的机器ID
接下来的2个字节中MongoDB的服务进程id
最后3个字节是简单的增量值
插入数据
db.集合名称.insert(document)
db.集合名称.save(document)
db.test0001.insert({“name”: “黄老邪”, “age”: 40})
{
"_id" : ObjectId("5d3eb09925efd79efad25a9a"),
"name" : "黄老邪",
"age" : 40.0
}
db.test0001.insert({"_id":“0000001”, “name”: “黄老邪”, “age”: 40})
{
"_id" : "0000001",
"name" : "黄老邪",
"age" : 40.0
}
插⼊⽂档时, 如果不指定_id参数, MongoDB会为⽂档分配⼀个唯⼀的ObjectId
db.test0001.save({“name”: “欧阳锋”, “age”: 40})
insert方法,_id相同会报错,save方法,_id 相同会更新数据
db.test0001.insert({"_id":"0000001", "name": "洪七公", "age": 40})
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: python.test0001 index: _id_ dup key: { : \"0000001\" }"
}
})
db.test0001.save({"_id":"0000001", "name": "洪七公", "age": 40})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
修改数据
db.集合名称.update(<query> ,<update>,{multi: <boolean>})
参数query:查询条件
参数update:更新操作符
参数multi:可选, 默认是false,表示只更新找到的第⼀条记录, 值为true表示把满⾜条件的⽂档全部更新
- 此种方法将删除除了name以外的其他字段
db.test0001.update({name:“黄老邪”}, {name: “黄药师”}) 更新一条
更新前
更新后{ "_id" : ObjectId("5d3eb09925efd79efad25a9a"), "name" : "黄老邪", "age" : 40 }
{ "_id" : ObjectId("5d3eb09925efd79efad25a9a"), "name" : "黄药师", "age" : 40 }
- 此种方法只更新指定的字段
db.test0001.update({name:“黄老邪”}, {$set: {name: “黄药师”}}) 更新一条
更新前
更新后{ "_id" : ObjectId("5d3eb09925efd79efad25a9a"), "name" : "黄药师", "age" : 40 }
db.test0001.update({}, {$set: {age: 45}}, {multi: true}) 更新全部{ "_id" : ObjectId("5d3eb09925efd79efad25a9a"), "name" : "黄药师" }
{ "_id" : ObjectId("5d3eaf9825efd79efad25a99"), "name" : "欧阳锋", "age" : "45" } // ---------------------------------------------- { "_id" : ObjectId("5d3eb09925efd79efad25a9a"), "name" : "黄药师", "age" : "45" } // ---------------------------------------------- { "_id" : "0000001", "name" : "洪七公", "age" : "45" }
删除数据
db.集合名称.remove(<query>,{justOne: <boolean>})
参数query:可选,删除的⽂档的条件
参数justOne:可选, 如果设为true或1, 则只删除⼀条, 默认false, 表示删除多条
db.test0001.remove({name: “黄药师”}, {justOne: true})
查询数据
db.集合名称.find()
- 初始化数据
db.test0001.save({"_id":"0000001", "name": "洪七公", "age": 40, "skill": "降龙十八掌", "address": "中原"})
db.test0001.save({"_id":"0000002", "name": "段志兴", "age": 40, "skill": "一阳指", "address": "大理"})
db.test0001.save({"_id":"0000003", "name": "黄药师", "age": 40, "skill": "碧海潮生曲", "address": "桃花岛"})
db.test0001.save({"_id":"0000004", "name": "欧阳锋", "age": 40, "skill": "蛤蟆功", "address": "西域"})
db.test0001.save({"_id":"0000005", "name": "周伯通", "age": 38, "skill": "左右互搏术", "address": "中原"})
db.test0001.save({"_id":"0000006", "name": "郭靖", "age": 20, "skill": "降龙十八掌", "address": "中原"})
db.test0001.save({"_id":"0000007", "name": "黄蓉", "age": 18, "skill": "打狗棒", "address": "桃花岛"})
db.test0001.save({"_id":"0000008", "name": "杨康", "age": 20, "skill": "九阴白骨爪", "address": "金国"})
db.test0001.save({"_id":"0000009", "name": "华珍", "age": 18, "skill": "弓箭", "address": "草原"})
- 大于,大于等于
$gt,$gte
db.test0001.find({age:{$gt: 20}})
{
"_id" : "0000001",
"name" : "洪七公",
"age" : 40.0,
"skill" : "降龙十八掌",
"address" : "中原"
}
// ----------------------------------------------
{
"_id" : "0000002",
"name" : "段志兴",
"age" : 40.0,
"skill" : "一阳指",
"address" : "大理"
}
// ----------------------------------------------
{
"_id" : "0000003",
"name" : "黄药师",
"age" : 40.0,
"skill" : "碧海潮生曲",
"address" : "桃花岛"
}
// ----------------------------------------------
{
"_id" : "0000004",
"name" : "欧阳锋",
"age" : 40.0,
"skill" : "蛤蟆功",
"address" : "西域"
}
// ----------------------------------------------
{
"_id" : "0000005",
"name" : "周伯通",
"age" : 38.0,
"skill" : "左右互搏术",
"address" : "中原"
}
db.test0001.find({age:{$gte: 20}})
{
"_id" : "0000001",
"name" : "洪七公",
"age" : 40.0,
"skill" : "降龙十八掌",
"address" : "中原"
}
// ----------------------------------------------
{
"_id" : "0000002",
"name" : "段志兴",
"age" : 40.0,
"skill" : "一阳指",
"address" : "大理"
}
// ----------------------------------------------
{
"_id" : "0000003",
"name" : "黄药师",
"age" : 40.0,
"skill" : "碧海潮生曲",
"address" : "桃花岛"
}
// ----------------------------------------------
{
"_id" : "0000004",
"name" : "欧阳锋",
"age" : 40.0,
"skill" : "蛤蟆功",
"address" : "西域"
}
// ----------------------------------------------
{
"_id" : "0000005",
"name" : "周伯通",
"age" : 38.0,
"skill" : "左右互搏术",
"address" : "中原"
}
// ----------------------------------------------
{
"_id" : "0000006",
"name" : "郭靖",
"age" : 20.0,
"skill" : "降龙十八掌",
"address" : "中原"
}
// ----------------------------------------------
{
"_id" : "0000008",
"name" : "杨康",
"age" : 20.0,
"skill" : "九阴白骨爪",
"address" : "金国"
}
- 小于,小于等于
$lt,$lte
{
"_id" : "0000007",
"name" : "黄蓉",
"age" : 18.0,
"skill" : "打狗棒",
"address" : "桃花岛"
}
// ----------------------------------------------
{
"_id" : "0000009",
"name" : "华珍",
"age" : 18.0,
"skill" : "弓箭",
"address" : "草原"
}
db.test0001.find({age:{$lte: 20}})
{
"_id" : "0000006",
"name" : "郭靖",
"age" : 20.0,
"skill" : "降龙十八掌",
"address" : "中原"
}
// ----------------------------------------------
{
"_id" : "0000007",
"name" : "黄蓉",
"age" : 18.0,
"skill" : "打狗棒",
"address" : "桃花岛"
}
// ----------------------------------------------
{
"_id" : "0000008",
"name" : "杨康",
"age" : 20.0,
"skill" : "九阴白骨爪",
"address" : "金国"
}
// ----------------------------------------------
{
"_id" : "0000009",
"name" : "华珍",
"age" : 18.0,
"skill" : "弓箭",
"address" : "草原"
}
- 不等于
$ne
db.test0001.find({age:{$nin: [18, 20]}})
db.test0001.find({age:{$ne: 40}})
{
"_id" : "0000005",
"name" : "周伯通",
"age" : 38.0,
"skill" : "左右互搏术",
"address" : "中原"
}
// ----------------------------------------------
{
"_id" : "0000006",
"name" : "郭靖",
"age" : 20.0,
"skill" : "降龙十八掌",
"address" : "中原"
}
// ----------------------------------------------
{
"_id" : "0000007",
"name" : "黄蓉",
"age" : 18.0,
"skill" : "打狗棒",
"address" : "桃花岛"
}
// ----------------------------------------------
{
"_id" : "0000008",
"name" : "杨康",
"age" : 20.0,
"skill" : "九阴白骨爪",
"address" : "金国"
}
// ----------------------------------------------
{
"_id" : "0000009",
"name" : "华珍",
"age" : 18.0,
"skill" : "弓箭",
"address" : "草原"
}
- 在
$in
db.test0001.find({age:{$in: [18, 20]}})
{
"_id" : "0000006",
"name" : "郭靖",
"age" : 20.0,
"skill" : "降龙十八掌",
"address" : "中原"
}
// ----------------------------------------------
{
"_id" : "0000007",
"name" : "黄蓉",
"age" : 18.0,
"skill" : "打狗棒",
"address" : "桃花岛"
}
// ----------------------------------------------
{
"_id" : "0000008",
"name" : "杨康",
"age" : 20.0,
"skill" : "九阴白骨爪",
"address" : "金国"
}
// ----------------------------------------------
{
"_id" : "0000009",
"name" : "华珍",
"age" : 18.0,
"skill" : "弓箭",
"address" : "草原"
}
- 不在
$nin
{
"_id" : "0000001",
"name" : "洪七公",
"age" : 40.0,
"skill" : "降龙十八掌",
"address" : "中原"
}
// ----------------------------------------------
{
"_id" : "0000002",
"name" : "段志兴",
"age" : 40.0,
"skill" : "一阳指",
"address" : "大理"
}
// ----------------------------------------------
{
"_id" : "0000003",
"name" : "黄药师",
"age" : 40.0,
"skill" : "碧海潮生曲",
"address" : "桃花岛"
}
// ----------------------------------------------
{
"_id" : "0000004",
"name" : "欧阳锋",
"age" : 40.0,
"skill" : "蛤蟆功",
"address" : "西域"
}
// ----------------------------------------------
{
"_id" : "0000005",
"name" : "周伯通",
"age" : 38.0,
"skill" : "左右互搏术",
"address" : "中原"
}
- 和
db.test0001.find({age:{$in: [18, 20]}, skill: "降龙十八掌"})
{
"_id" : "0000006",
"name" : "郭靖",
"age" : 20.0,
"skill" : "降龙十八掌",
"address" : "中原"
}
$or
db.test0001.find({$or: [{age:{$in: [18, 20]}}, {skill: "降龙十八掌"}]})
{
"_id" : "0000001",
"name" : "洪七公",
"age" : 40.0,
"skill" : "降龙十八掌",
"address" : "中原"
}
// ----------------------------------------------
{
"_id" : "0000006",
"name" : "郭靖",
"age" : 20.0,
"skill" : "降龙十八掌",
"address" : "中原"
}
// ----------------------------------------------
{
"_id" : "0000007",
"name" : "黄蓉",
"age" : 18.0,
"skill" : "打狗棒",
"address" : "桃花岛"
}
// ----------------------------------------------
{
"_id" : "0000008",
"name" : "杨康",
"age" : 20.0,
"skill" : "九阴白骨爪",
"address" : "金国"
}
// ----------------------------------------------
{
"_id" : "0000009",
"name" : "华珍",
"age" : 18.0,
"skill" : "弓箭",
"address" : "草原"
}
- 正则表达式查询
db.test0001.find({name:{$regex:'^黄'}})
{
"_id" : "0000003",
"name" : "黄药师",
"age" : 40.0,
"skill" : "碧海潮生曲",
"address" : "桃花岛"
}
// ----------------------------------------------
{
"_id" : "0000007",
"name" : "黄蓉",
"age" : 18.0,
"skill" : "打狗棒",
"address" : "桃花岛"
}
- 求和
db.test0001.find({skill: "降龙十八掌"}).count()
db.test0001.count()
- 投影
在查询到的返回结果中, 只选择必要的字段
db.集合名称.find({},{字段名称:1,…})
普通参数为字段,值为1表示显示,不写表示不显示不能设置为0,,设置为0会报错\color{red}{普通参数为字段,值为1表示显示,不写表示不显示不能设置为0,,设置为0会报错}普通参数为字段,值为1表示显示,不写表示不显示不能设置为0,,设置为0会报错
特殊:对于id列默认是显示的,如果不显示需要明确设置为0\color{red}{特殊:对于_id列默认是显示的,如果不显示需要明确设置为0 }特殊:对于id列默认是显示的,如果不显示需要明确设置为0
db.stu.find({},{_id:0,name:1,gender:1})
- 自定义查询
使⽤$where后⾯写⼀个函数, 返回满⾜条件的数据
查询年龄⼤于30的人物
db.test0001.find({
$where:function() {
return this.age>30;}
})
{
"_id" : "0000001",
"name" : "洪七公",
"age" : 40.0,
"skill" : "降龙十八掌",
"address" : "中原"
}
// ----------------------------------------------
{
"_id" : "0000002",
"name" : "段志兴",
"age" : 40.0,
"skill" : "一阳指",
"address" : "大理"
}
// ----------------------------------------------
{
"_id" : "0000003",
"name" : "黄药师",
"age" : 40.0,
"skill" : "碧海潮生曲",
"address" : "桃花岛"
}
// ----------------------------------------------
{
"_id" : "0000004",
"name" : "欧阳锋",
"age" : 40.0,
"skill" : "蛤蟆功",
"address" : "西域"
}
// ----------------------------------------------
{
"_id" : "0000005",
"name" : "周伯通",
"age" : 38.0,
"skill" : "左右互搏术",
"address" : "中原"
}
排序和去重
- 排序
db.集合名称.find().sort({字段:1,…})
参数1为升序排列
参数-1为降序排列
db.test0001.find({address: "中原"}).sort({"age": -1})
{
"_id" : "0000001",
"name" : "洪七公",
"age" : 40.0,
"skill" : "降龙十八掌",
"address" : "中原"
}
// ----------------------------------------------
{
"_id" : "0000005",
"name" : "周伯通",
"age" : 38.0,
"skill" : "左右互搏术",
"address" : "中原"
}
// ----------------------------------------------
{
"_id" : "0000006",
"name" : "郭靖",
"age" : 20.0,
"skill" : "降龙十八掌",
"address" : "中原"
}
- 去重
db.test0001.distinct("skill")
[
"降龙十八掌",
"一阳指",
"碧海潮生曲",
"蛤蟆功",
"左右互搏术",
"打狗棒",
"九阴白骨爪",
"弓箭"
]
limit和skip
⽅法limit(): ⽤于读取指定数量的⽂档
db.集合名称.find().limit(NUMBER)
查询2条学⽣信息
db.test0001.find().limit(2)
⽅法skip(): ⽤于跳过指定数量的⽂档
db.集合名称.find().skip(NUMBER)
db.test0001.find().skip(5)
同时使用
db.test0001.find().limit(2).skip(5)
或
db.test0001.find().skip(5).limit(2)
聚合 aggregate
聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
db.集合名称.aggregate({管道:{表达式}})
db.test0001.aggregate({$group: {_id: "$address", count: {$sum: 1}}})
聚合函数$group
后面聚合后的列明必须为_id
。 $sum
后的1表示对聚合后的结果进行求和,如果为2,则将求和后的结果乘以2
{
"_id" : "金国",
"count" : 1.0
}
// ----------------------------------------------
{
"_id" : "中原",
"count" : 3.0
}
// ----------------------------------------------
{
"_id" : "桃花岛",
"count" : 2.0
}
// ----------------------------------------------
{
"_id" : "草原",
"count" : 1.0
}
// ----------------------------------------------
{
"_id" : "大理",
"count" : 1.0
}
// ----------------------------------------------
{
"_id" : "西域",
"count" : 1.0
}
- 常用的管道
在mongodb中,⽂档处理完毕后, 通过管道进⾏下⼀次处理
常用管道如下:
$group
: 将集合中的⽂档分组, 可⽤于统计结果
$match
: 过滤数据, 只输出符合条件的⽂档
$project
: 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
$sort
: 将输⼊⽂档排序后输出
$limit
: 限制聚合管道返回的⽂档数
$skip
: 跳过指定数量的⽂档, 并返回余下的⽂档
$unwind
: 将数组类型的字段进⾏拆分 - 表达式
处理输⼊⽂档并输出
语法:表达式:’$列名
’
常⽤表达式:
$sum
: 计算总和,$sum:1
表示以⼀倍计数
$avg
: 计算平均值
$min
: 获取最⼩值
$max
: 获取最⼤值
$push
: 在结果⽂档中插⼊值到⼀个数组中
$first
: 根据资源⽂档的排序获取第⼀个⽂档数据
$last
: 根据资源⽂档的排序获取最后⼀个⽂档数据
$group
db.test0001.aggregate({$group: {_id: "$address", count: {$sum: 1}}})
db.test0001.aggregate({$group: {_id: "$address", count: {$sum: 1}, avrage_age: {$avg: "$age"}}})
$match
$match
相当于find,聚合函数里面不能用find只能用$match
db.test0001.aggregate({$match: {age: {$gt: 20}}},{ $group: { _id: "$address", count: { $sum: 1 }, avrage_age: { $avg: "$age" } } })
{
"_id" : "西域",
"count" : 1.0,
"avrage_age" : 40.0
}
// ----------------------------------------------
{
"_id" : "桃花岛",
"count" : 1.0,
"avrage_age" : 40.0
}
// ----------------------------------------------
{
"_id" : "大理",
"count" : 1.0,
"avrage_age" : 40.0
}
// ----------------------------------------------
{
"_id" : "中原",
"count" : 2.0,
"avrage_age" : 39.0
}
$project
$project
用于修改文档输出结构,如增加,修改,删除字段,创建计算结果等
db.test0001.aggregate({$group: {_id: "$age", count:{$sum: 1}}}, {$project: {_id: 0, count: 1}})
{
"count" : 2.0
}
// ----------------------------------------------
{
"count" : 2.0
}
// ----------------------------------------------
{
"count" : 1.0
}
// ----------------------------------------------
{
"count" : 4.0
}
db.test0001.aggregate({$group: {_id: "$age", count:{$sum: 1}}}, {$project: {_id: 0, totle: "$count"}})
{
"totle" : 2.0
}
// ----------------------------------------------
{
"totle" : 2.0
}
// ----------------------------------------------
{
"totle" : 1.0
}
// ----------------------------------------------
{
"totle" : 4.0
}
$sort
db.test0001.aggregate({$group: {_id: "$age", count:{$sum: 1}}}, {$project: {_id: 0, age: "$_id", count:1}},{$sort: {_id: 1}})
{
"count" : 2.0,
"age" : 18.0
}
// ----------------------------------------------
{
"count" : 2.0,
"age" : 20.0
}
// ----------------------------------------------
{
"count" : 1.0,
"age" : 38.0
}
// ----------------------------------------------
{
"count" : 4.0,
"age" : 40.0
}
$limit
和$skip
db.test0001.aggregate({$group: {_id: "$age", count:{$sum: 1}}}, {$project: {_id: 0, age: "$_id", count:1}},{$sort: {_id: 1}}, {$skip: 1}, {$limit: 2})
{
"count" : 2.0,
"age" : 20.0
}
// ----------------------------------------------
{
"count" : 1.0,
"age" : 38.0
}
$unwind
将⽂档中的某⼀个数组类型字段拆分成多条, 每条包含数组中的⼀个值
语法:db.集合名称.aggregate({$unwind:'$字段名称'})
修改数据
db.test0001.update({"_id": "0000001"}, {$set: {hobby: ["叫花鸡", "睡觉", "龙凤汤"]}})
db.test0001.update({"_id": "0000002"}, {$set: {hobby: ["敲木鱼", "念经"]}})
db.test0001.update({"_id": "0000003"}, {$set: {hobby: ["下棋", "吹箫", "画画"]}})
db.test0001.update({"_id": "0000004"}, {$set: {hobby: ["养蛇", "练毒"]}})
db.test0001.update({"_id": "0000005"}, {$set: {hobby: ["玩"]}})
db.test0001.update({"_id": "0000006"}, {$set: {hobby: null}})
db.test0001.update({"_id": "0000007"}, {$set: {hobby: ["做菜", "靖哥哥"]}})
用$unwind拆分数组中的字段
db.test0001.aggregate({$unwind: '$hobby'})
结果
{
"_id" : "0000001",
"name" : "洪七公",
"age" : 40.0,
"skill" : "降龙十八掌",
"address" : "中原",
"hobby" : "叫花鸡"
}
// ----------------------------------------------
{
"_id" : "0000001",
"name" : "洪七公",
"age" : 40.0,
"skill" : "降龙十八掌",
"address" : "中原",
"hobby" : "睡觉"
}
// ----------------------------------------------
{
"_id" : "0000001",
"name" : "洪七公",
"age" : 40.0,
"skill" : "降龙十八掌",
"address" : "中原",
"hobby" : "龙凤汤"
}
// ----------------------------------------------
{
"_id" : "0000002",
"name" : "段志兴",
"age" : 40.0,
"skill" : "一阳指",
"address" : "大理",
"hobby" : "敲木鱼"
}
// ----------------------------------------------
{
"_id" : "0000002",
"name" : "段志兴",
"age" : 40.0,
"skill" : "一阳指",
"address" : "大理",
"hobby" : "念经"
}
// ----------------------------------------------
{
"_id" : "0000003",
"name" : "黄药师",
"age" : 40.0,
"skill" : "碧海潮生曲",
"address" : "桃花岛",
"hobby" : "下棋"
}
// ----------------------------------------------
{
"_id" : "0000003",
"name" : "黄药师",
"age" : 40.0,
"skill" : "碧海潮生曲",
"address" : "桃花岛",
"hobby" : "吹箫"
}
// ----------------------------------------------
{
"_id" : "0000003",
"name" : "黄药师",
"age" : 40.0,
"skill" : "碧海潮生曲",
"address" : "桃花岛",
"hobby" : "画画"
}
// ----------------------------------------------
{
"_id" : "0000004",
"name" : "欧阳锋",
"age" : 40.0,
"skill" : "蛤蟆功",
"address" : "西域",
"hobby" : "养蛇"
}
// ----------------------------------------------
{
"_id" : "0000004",
"name" : "欧阳锋",
"age" : 40.0,
"skill" : "蛤蟆功",
"address" : "西域",
"hobby" : "练毒"
}
// ----------------------------------------------
{
"_id" : "0000005",
"name" : "周伯通",
"age" : 38.0,
"skill" : "左右互搏术",
"address" : "中原",
"hobby" : "玩"
}
// ----------------------------------------------
{
"_id" : "0000007",
"name" : "黄蓉",
"age" : 18.0,
"skill" : "打狗棒",
"address" : "桃花岛",
"hobby" : "做菜"
}
// ----------------------------------------------
{
"_id" : "0000007",
"name" : "黄蓉",
"age" : 18.0,
"skill" : "打狗棒",
"address" : "桃花岛",
"hobby" : "靖哥哥"
}
属性preserveNullAndEmptyArrays值为false表示丢弃属性值为空的⽂档
属性preserveNullAndEmptyArrays值为true表示保留属性值为空的⽂档
用法:
db.test0001.aggregate({$unwind: {path: "$hobby", preserveNullAndEmptyArrays: true}})
- 建立索引:
语法:db.集合.ensureIndex({属性:1}),1表示升序, -1表示降序
db.test0001.ensureIndex({name:-1})
在默认情况下创建的索引均不是唯一索引。 - 创建唯一索引:
db.test0001.ensureIndex({"name":1},{"unique":true})
创建唯一索引并消除重复:
db.test0001.ensureIndex({"name":1},{"unique":true,"dropDups":true})
- 建立联合索引(什么时候需要联合索引):
db.test0001.ensureIndex({name:1,age:1})
- 查看当前集合的所有索引:
db.test0001.getIndexes()
- 删除索引:
db.test0001.dropIndex('索引名称')