Mongodb增删改查高级操作

MongoDB中常见数据类型

  • Object ID
  • Integer
  • Double
  • Arrays:数组或列表,多个值存储到一个键
  • Object:嵌入式文档,一个值为一个文档
  • Null
  • Timestamp
  • Date:存储当前日期或时间的unix时间格式

增删改

保存语法
insert:直接插入:

db.集合名称.insert(document)
db.beauty.insert({name:'aaa',hobby:[{playgames:'wow'},{music:'chinese'}]})

这里写图片描述


save:如果文档的_id已经存在则修改,如果文档的_id不存在则添加*

db.集合名称.save(document)
> db.beauty.find()
{ "_id" : ObjectId("5ac3341e110f45b8bc9dc8f9"), "name" : "zhoujielun" }
{ "_id" : ObjectId("5ac334e7110f45b8bc9dc8fa"), "name" : "zhoujielun", "age" : 11 }
{ "_id" : "5ac3341e110f45b8bc9dc8f9", "name" : "zg" }
> db.beauty.save({_id:ObjectId("5ac3341e110f45b8bc9dc8f9"),name:'zeng'})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.beauty.find()
{ "_id" : ObjectId("5ac3341e110f45b8bc9dc8f9"), "name" : "zeng" }
{ "_id" : ObjectId("5ac334e7110f45b8bc9dc8fa"), "name" : "zhoujielun", "age" : 11 }
{ "_id" : "5ac3341e110f45b8bc9dc8f9", "name" : "zg" }

修改语法

db.集合名称.update(<query>,<update>,{multi:<boolean>})

参数query:查询条件,类似于sql语句中update中where部分
参数update:更新操作符,类似sql语句中update中set部分
参数multi:可选,默认false,表示只更新找到的第一条记录,值为true表示把所有满足条件的文档全部更新【需要配合$set】

  • 全文档更新
> db.beauty.insert({name:'zhangsan',age:11})
WriteResult({ "nInserted" : 1 })
> db.beauty.find()
{ "_id" : ObjectId("5ac3341e110f45b8bc9dc8f9"), "name" : "jjjjjj" }
{ "_id" : ObjectId("5ac334e7110f45b8bc9dc8fa"), "name" : "hhhhh", "age" : 11 }
{ "_id" : ObjectId("5ac3368a110f45b8bc9dc8fb"), "name" : "zhangsan", "age" : 11 }
> db.beauty.update({name:'zhangsan'},{name:'lisi'})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.beauty.find()
{ "_id" : ObjectId("5ac3341e110f45b8bc9dc8f9"), "name" : "jjjjjj" }
{ "_id" : ObjectId("5ac334e7110f45b8bc9dc8fa"), "name" : "hhhhh", "age" : 11 }
{ "_id" : ObjectId("5ac3368a110f45b8bc9dc8fb"), "name" : "lisi" }
  • 指定属性更新,不会覆盖其他属性,$set设置
> db.beauty.find()
{ "_id" : ObjectId("5ac3341e110f45b8bc9dc8f9"), "name" : "jjjjjj" }
{ "_id" : ObjectId("5ac334e7110f45b8bc9dc8fa"), "name" : "hhhhh", "age" : 11 }
{ "_id" : ObjectId("5ac3368a110f45b8bc9dc8fb"), "name" : "lisi" }
> db.beauty.update({},{$set:{name:'zhoujielun'}},{multi:true})
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })
> db.beauty.find()
{ "_id" : ObjectId("5ac3341e110f45b8bc9dc8f9"), "name" : "zhoujielun" }
{ "_id" : ObjectId("5ac334e7110f45b8bc9dc8fa"), "name" : "zhoujielun", "age" : 11 }
{ "_id" : ObjectId("5ac3368a110f45b8bc9dc8fb"), "name" : "zhoujielun" }

删除语法

db.集合名称.remove(<query>,{justOne:<boolean>})

参数query:可选,删除文档条件,无条件为{},就算没有匹配条件,空json还得写
参数justOne:可选,如果设为true或1,则只删除一条,默认false,删除多条
只删除匹配到的第一条

  • 只删除匹配到的第一条
> db.beauty.find()
{ "_id" : ObjectId("5ac3341e110f45b8bc9dc8f9"), "name" : "zeng" }
{ "_id" : ObjectId("5ac334e7110f45b8bc9dc8fa"), "name" : "zhoujielun", "age" : 11 }
{ "_id" : ObjectId("5ac3368a110f45b8bc9dc8fb"), "name" : "zhoujielun" }
> db.beauty.remove({age:11},{justOne:true})
WriteResult({ "nRemoved" : 1 })
> db.beauty.find()
{ "_id" : ObjectId("5ac3341e110f45b8bc9dc8f9"), "name" : "zeng" }
{ "_id" : ObjectId("5ac3368a110f45b8bc9dc8fb"), "name" : "zhoujielun" }
  • 删除全部
db.beauty.remove({})
  • 创建固定大小的集合,当超过10条数据后,第11条数据会覆盖最老的第一条数据
db.createCollection(‘sub’,{capped:true,size:10})

查询

1 方法find()

db.集合名称.find({<query>})
方法findOne():查询,只返回第一个
db.集合名称.findOne({<query>})

2 比较运算符

等于:默认等于判断,无运算符
小于$lt
小于或等于$lte
大于$gt
大于或等于$gte
不等于$ne
> db.beauty.find()
{ "_id" : ObjectId("5ac3341e110f45b8bc9dc8f9"), "name" : "zeng" }
{ "_id" : ObjectId("5ac3368a110f45b8bc9dc8fb"), "name" : "zhoujielun" }
{ "_id" : ObjectId("5ac33953110f45b8bc9dc8fc"), "name" : "zhoujielun" }
{ "_id" : "ObjectId(\"5ac3341e110f45b8bc9dc8f9\")", "name" : "zeng" }
{ "_id" : "5ac3341e110f45b8bc9dc8f9", "name" : "kk", "age" : 10 }
> db.beauty.find({age:{$gt:9}})
{ "_id" : "5ac3341e110f45b8bc9dc8f9", "name" : "kk", "age" : 10 }

3 逻辑运算符

查询时可以有多个条件,多个条件之间需要通过逻辑运算符连接
逻辑与:使用,逗号
查询年龄大于或等于18且性别为1的学生
db.beauty.find({age:{$gte:18},gender:1})
逻辑或:使用$or为键,值为数组,数组中再一个一个构造json
查询年龄大于18,或性别为0的学生
db.beauty.find({ $or:[ {age:{$gt:18}},{gender:0} ] })
> db.beauty.find({$or:[{name:'zeng'},{age:{$gt:9}}]})
{ "_id" : ObjectId("5ac3341e110f45b8bc9dc8f9"), "name" : "zeng" }
{ "_id" : "ObjectId(\"5ac3341e110f45b8bc9dc8f9\")", "name" : "zeng" }
{ "_id" : "5ac3341e110f45b8bc9dc8f9", "name" : "kk", "age" : 10 }

4 范围运算符
使用 i n , nin判断是否在某个范围内

如查询年龄为18,28的学生
db.stu.find({age: {$in:[18,28]} })
> db.beauty.find()
{ "_id" : ObjectId("5ac3341e110f45b8bc9dc8f9"), "name" : "zeng" }
{ "_id" : ObjectId("5ac3368a110f45b8bc9dc8fb"), "name" : "zhoujielun" }
{ "_id" : ObjectId("5ac33953110f45b8bc9dc8fc"), "name" : "zhoujielun" }
{ "_id" : "ObjectId(\"5ac3341e110f45b8bc9dc8f9\")", "name" : "zeng" }
{ "_id" : "5ac3341e110f45b8bc9dc8f9", "name" : "kk", "age" : 10 }
{ "_id" : ObjectId("5ac34af9110f45b8bc9dc8fd"), "namge" : "xiaojie", "age" : 18 }
> db.beauty.find({age:{$in:[10,18]}})
{ "_id" : "5ac3341e110f45b8bc9dc8f9", "name" : "kk", "age" : 10 }
{ "_id" : ObjectId("5ac34af9110f45b8bc9dc8fd"), "namge" : "xiaojie", "age" : 18 }

5 支持正则
查询name中以黄开头的

db.stu.find({name:/^黄/})

6 自定义函数function中写js表达式

> db.beauty.find({$where:function(){return this.age>15}})
{ "_id" : ObjectId("5ac34af9110f45b8bc9dc8fd"), "namge" : "xiaojie", "age" : 18 }

7 分页
limit():用于读取指定数量的文档,limit数字为获取几条
Skip():用于跳过指定数量的文档,数字为跳过记录条数,默认为0

查询第58条数据
db.stu.find().limit(4).skip(5)
或
db.stu.find().skip(5).limit(4)
{ "_id" : ObjectId("5ac3341e110f45b8bc9dc8f9"), "name" : "zeng" }
{ "_id" : ObjectId("5ac3368a110f45b8bc9dc8fb"), "name" : "zhoujielun" }
{ "_id" : ObjectId("5ac33953110f45b8bc9dc8fc"), "name" : "zhoujielun" }
{ "_id" : "ObjectId(\"5ac3341e110f45b8bc9dc8f9\")", "name" : "zeng" }
{ "_id" : "5ac3341e110f45b8bc9dc8f9", "name" : "kk", "age" : 10 }
{ "_id" : ObjectId("5ac34af9110f45b8bc9dc8fd"), "namge" : "xiaojie", "age" : 18 }
> db.beauty.find().skip(3).limit(2)
{ "_id" : "ObjectId(\"5ac3341e110f45b8bc9dc8f9\")", "name" : "zeng" }
{ "_id" : "5ac3341e110f45b8bc9dc8f9", "name" : "kk", "age" : 10 }

8 投影
在查询到的返回结果中,只选择必要字段,而不是一个文档的整个字段
如:一个文档有5个字段,需要显示3个投影其中3个字段即可
语法:

db.集合名称.find({},{字段名称:1 , ...})

需要显示字段,设置为1,不设置即不显示
特殊:对于_id列默认显示,如果不现实需要明确设置0

> db.beauty.find({},{name:1})
{ "_id" : ObjectId("5ac3341e110f45b8bc9dc8f9"), "name" : "zeng" }
{ "_id" : ObjectId("5ac3368a110f45b8bc9dc8fb"), "name" : "zhoujielun" }
{ "_id" : ObjectId("5ac33953110f45b8bc9dc8fc"), "name" : "zhoujielun" }
{ "_id" : "ObjectId(\"5ac3341e110f45b8bc9dc8f9\")", "name" : "zeng" }
{ "_id" : "5ac3341e110f45b8bc9dc8f9", "name" : "kk" }
{ "_id" : ObjectId("5ac34af9110f45b8bc9dc8fd") }
> db.beauty.find({},{name:1,_id:0})
{ "name" : "zeng" }
{ "name" : "zhoujielun" }
{ "name" : "zhoujielun" }
{ "name" : "zeng" }
{ "name" : "kk" }
{  }

9 排序

方法sort(),语法
db.集合名称.find().sort({字段:1,...})
参数1为升序,-1为降序
例子:根据性别降序,再根据年龄升序
db.stu.find().sort({gender:-1,age:1})
db.beauty.find().sort({age:-1})

10 统计个数

方法count()
语法:db.集合名称.find({<query>}).count()
例子:统计男生人数
db.stu.find({gender:1}).count()
统计年龄大于20的男生人数
db.stu.find({age:{$gt:20},gender:1}).count()

聚合操作

管道的概念:
将第一个json处理的结果暂存起来作为这个数组的第二个json的输入依次进行处理

db.集合名称.aggregate([{管道:表达式},{}])
语法:
    表达式:’$列名’
    常用管道
$group依据什么分组
    Id:’$gender‘ 根据性别分组,即这个值相同的放到一组
$match:过滤数据,只输出符合条件的文档
$sort:将输入文档排序后输出
$project:投影

1 group举例:
插入如下5条数据
这里写图片描述
1.1 分别按照男和女分组,并求每个分组的人数

db.student.aggregate([{$group:{_id:'$gender',counter:{$sum:1}}}])

这里写图片描述
1.2 求男生的年龄和以及女生的年龄和

db.student.aggregate([{$group:{_id:'$gender',counter:{$sum:'$age'}}}])

这里写图片描述

1.3 求分组后男生组的每个男生的年龄以及女生组的每个女生的年龄[mongo特性]

db.student.aggregate([{$group:{_id:'$gender',counter:{$min:'$age'}}}])
{
    "_id" : -1.0,
    "counter" : [ 
        18.0, 
        19.0
    ]
}
{
    "_id" : 1.0,
    "counter" : [ 
        20.0, 
        23.0, 
        30.0
    ]
}

1.4 求分组后男女生组各自组内成员的信息[mongo特性]

db.student.aggregate([{$group:{_id:'$gender',counter:{$push:'$$ROOT'}}}])
/* 1 */
{
    "_id" : -1.0,
    "counter" : [ 
        {
            "_id" : ObjectId("5aca320aca27d76432fc29dd"),
            "name" : "貂蝉",
            "gender" : -1.0,
            "age" : 18.0
        }, 
        {
            "_id" : ObjectId("5aca3232ca27d76432fc29e0"),
            "name" : "小乔",
            "gender" : -1.0,
            "age" : 19.0
        }
    ]
}

/* 2 */
{
    "_id" : 1.0,
    "counter" : [ 
        {
            "_id" : ObjectId("5aca31fdca27d76432fc29dc"),
            "name" : "赵云",
            "gender" : 1.0,
            "age" : 20.0
        }, 
        {
            "_id" : ObjectId("5aca321cca27d76432fc29de"),
            "name" : "吕布",
            "gender" : 1.0,
            "age" : 23.0
        }, 
        {
            "_id" : ObjectId("5aca3225ca27d76432fc29df"),
            "name" : "曹操",
            "gender" : 1.0,
            "age" : 30.0
        }
    ]
}

2 $match管道
2.1 查询年龄大于20的男生和女生

db.student.aggregate([{$match:{age:{$gt:20}}}])
/* 1 */
{
    "_id" : ObjectId("5aca321cca27d76432fc29de"),
    "name" : "吕布",
    "gender" : 1.0,
    "age" : 23.0
}

/* 2 */
{
    "_id" : ObjectId("5aca3225ca27d76432fc29df"),
    "name" : "曹操",
    "gender" : 1.0,
    "age" : 30.0
}

2.1 查询年龄大于18的男生和女生的分类性别和个数

db.student.aggregate([{$match:{age:{$gt:18}}},{$group:{_id:'$gender',total:{$sum:1}}}])
/* 1 */
{
    "_id" : -1.0,
    "total" : 1.0
}

/* 2 */
{
    "_id" : 1.0,
    "total" : 3.0
}

3 $project管道
查询年龄大于18的男生和女生的个数

db.student.aggregate([{$match:{age:{$gt:18}}},{$group:{_id:'$gender',total:{$sum:1}}},{$project:{_id:0,total:1}}])
/* 1 */
{
    "total" : 1.0
}

/* 2 */
{
    "total" : 3.0
}

猜你喜欢

转载自blog.csdn.net/bsfz_2018/article/details/79853099
今日推荐