侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 144668 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

mongodb中的查询find操作

2023-12-01 星期五 / 0 评论 / 0 点赞 / 7 阅读 / 13818 字

要练习查询首先要有数据,先用for循环插入了20条数据(就是javascript语法) >for(vari=1;i<=20;i++){db.student.insert({"name":"name"+

要练习查询首先要有数据,先用for循环插入了20条数据(就是javascript语法)

> for( var i=1;i<=20;i++){ db.student.insert({"name":"name"+i,"sort":"sort"+i,"tel":"1234"+i})}

mongodb是用find来进行查询的,返回一个集合中文档的子集,子集合范围从0个文档到整个文档,也是通过参数决定要查询的细节。空的查询文档会匹配集合的所有内容,如要不指定查询内容,默认就是{}。

查询所有内容

语法:db.<集合名>.find()(类似于sql中的select * from 表名)【等同于db.<集合名>.find({})】

查询一条记录

db.<集合名>.findOne();(findOne()首字母one要大写,~.~)

> db.student.findOne(){    "_id" : ObjectId("56e4d9e9bf48eabb5d350a99"),    "name" : "name1",    "sort" : "sort1",    "tel" : "12341"}
返回指定的键

语法:db.<集合>.find({},{"键名":1,"键名":0})后面的这个{}里面指定要查询的内容,需要的就给参数 1,不需要的就给参数0(类似于sql中select 列名,列名 from 表名)

> db.student.find({},{name:1,_id:0}){ "name" : "name1" }{ "name" : "name2" }{ "name" : "name3" }{ "name" : "name4" }{ "name" : "name5" }{ "name" : "name6" }{ "name" : "name7" }{ "name" : "name8" }{ "name" : "name9" }{ "name" : "name10" }{ "name" : "name11" }{ "name" : "name12" }{ "name" : "name13" }{ "name" : "name14" }{ "name" : "name15" }{ "name" : "name16" }{ "name" : "name17" }{ "name" : "name18" }{ "name" : "name19" }{ "name" : "name20" }

只要name这个键,默认的会返回_id,我们设置_id:0即可。

查询条件

在第一个{}来指定条件,进行查询,类似sql中的where查询

> db.student.find({"tel":{"$gte":"123410","$lte":"123413"}}){ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa2"), "name" : "name10", "sort" : "sort10", "tel" : "123410" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa3"), "name" : "name11", "sort" : "sort11", "tel" : "123411" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa4"), "name" : "name12", "sort" : "sort12", "tel" : "123412" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa5"), "name" : "name13", "sort" : "sort13", "tel" : "123413" }

查询tel在123410和123413之间的文档。

下面这个是指定记录查询,有点类似于sql中的(select * from student where tel="12342";)

> db.student.find({"tel":"12342"}){ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9a"), "name" : "name2", "sort" : "sort2", "tel" : "12342" }> db.student.find({"tel":"12342","name":"123"})> db.student.find({"tel":"12342","name":"name2"}){ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9a"), "name" : "name2", "sort" : "sort2", "tel" : "12342" }

在find前面一个{}里面用,连接的映射条件,其实就是and条件的查询,

在mongodb中也有对应的 or 查询使用的,符号是 $or

> db.student.find({$or:[{"name":"name2"},{"name":"name3"}]}){ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9a"), "name" : "name2", "sort" : "sort2", "tel" : "12342" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9b"), "name" : "name3", "sort" : "sort3", "tel" : "12343" }

$in基本上也是or的关系,和MySQL中的in(..,..,...)类似    另外$nin和$in关系是相反的,类似于 not in(,)

> db.student.find({"tel":{$in:["12341","12342","123420"]}}){ "_id" : ObjectId("56e4d9e9bf48eabb5d350a99"), "name" : "name1", "sort" : "sort1", "tel" : "12341" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9a"), "name" : "name2", "sort" : "sort2", "tel" : "12342" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aac"), "name" : "name20", "sort" : "sort20", "tel" : "123420" }

$all用来通过多个元素匹配数组数组

> db.food.insert({"animal":["dog","cat","python"]})> db.food.insert({"animal":["dog","cat","pig"]})> db.food.insert({"animal":["pig","cat","python"]})> db.food.find({"animal":{$all:["cat","python"]}},{_id:0}){ "animal" : [ "dog", "cat", "python" ] }{ "animal" : [ "pig", "cat", "python" ] }

排序.sort

语法:db.<集合名>.find().sort({"键名":1})(参数1为升序,-1为降序)

限制数目 .limit

语法:db.<集合名>.find().limit(number)(number为限制返回的数目)

> db.student.find().sort({"tel":1}).limit(5){ "_id" : ObjectId("56e4d9e9bf48eabb5d350a99"), "name" : "name1", "sort" : "sort1", "tel" : "12341" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa2"), "name" : "name10", "sort" : "sort10", "tel" : "123410" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa3"), "name" : "name11", "sort" : "sort11", "tel" : "123411" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa4"), "name" : "name12", "sort" : "sort12", "tel" : "123412" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa5"), "name" : "name13", "sort" : "sort13", "tel" : "123413" }> db.student.find().sort({"tel":-1}).limit(5){ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa1"), "name" : "name9", "sort" : "sort9", "tel" : "12349" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa0"), "name" : "name8", "sort" : "sort8", "tel" : "12348" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9f"), "name" : "name7", "sort" : "sort7", "tel" : "12347" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9e"), "name" : "name6", "sort" : "sort6", "tel" : "12346" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9d"), "name" : "name5", "sort" : "sort5", "tel" : "12345" }

上面是对tel进行降序和升序的查询。并指定返回5条记录

跳过记录:.skip(number)

> db.student.find().skip(15){ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa8"), "name" : "name16", "sort" : "sort16", "tel" : "123416" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa9"), "name" : "name17", "sort" : "sort17", "tel" : "123417" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aaa"), "name" : "name18", "sort" : "sort18", "tel" : "123418" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aab"), "name" : "name19", "sort" : "sort19", "tel" : "123419" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aac"), "name" : "name20", "sort" : "sort20", "tel" : "123420" }

一共20行记录,省略了前面15行,只返回后面5行

可以使用.skip().limit()实现翻页的功能

> db.student.find().skip(5).limit(5){ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9e"), "name" : "name6", "sort" : "sort6", "tel" : "12346" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350a9f"), "name" : "name7", "sort" : "sort7", "tel" : "12347" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa0"), "name" : "name8", "sort" : "sort8", "tel" : "12348" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa1"), "name" : "name9", "sort" : "sort9", "tel" : "12349" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa2"), "name" : "name10", "sort" : "sort10", "tel" : "123410" }> db.student.find().skip(10).limit(5){ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa3"), "name" : "name11", "sort" : "sort11", "tel" : "123411" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa4"), "name" : "name12", "sort" : "sort12", "tel" : "123412" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa5"), "name" : "name13", "sort" : "sort13", "tel" : "123413" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa6"), "name" : "name14", "sort" : "sort14", "tel" : "123414" }{ "_id" : ObjectId("56e4d9e9bf48eabb5d350aa7"), "name" : "name15", "sort" : "sort15", "tel" : "123415" }

聚合操作

求数目

语法:db.<集合>.count() ;类似于sql中select count(*) from 表名

> db.student.count()20> db.student.find().limit(1){ "_id" : ObjectId("56e4d9e9bf48eabb5d350a99"), "name" : "name1", "sort" : "sort1", "tel" : "12341" }

如果是求某一列的

> db.student.count({},{"name":1})20

一般的数学运算

先模拟数据

> for(var i=1;i<20;i++){db.test1.insert({"num":i})}WriteResult({ "nInserted" : 1 })

下面是关于一列的求和,最大值,最小值,和平均值
语法:db.<集合名>.aggregate({$group:{_id:"  ",返回的名字:{函数:"$列名"}}})

> db.test1.aggregate({$group:{_id:"  ",sumsal:{$sum:"$num"}}}){ "_id" : "  ", "sumsal" : 190 }> db.test1.aggregate({$group:{_id:"  ",sumsal:{$max:"$num"}}}){ "_id" : "  ", "sumsal" : 19 }> db.test1.aggregate({$group:{_id:"  ",sumsal:{$min:"$num"}}}){ "_id" : "  ", "sumsal" : 1 }> db.test1.aggregate({$group:{_id:"  ",sumsal:{$avg:"$num"}}}){ "_id" : "  ", "sumsal" : 10 }


在mangodb中进行sql中group by 的操作,只需要在原来基础空格上加上列名

重新模拟数据

> for(var i=1;i<5;i++){db.test2.insert({"num":i,"type":1})}WriteResult({ "nInserted" : 1 })> for(var i=5;i<10;i++){db.test2.insert({"num":i,"type":2})}WriteResult({ "nInserted" : 1 })> for(var i=10;i<15;i++){db.test2.insert({"num":i,"type":3})}WriteResult({ "nInserted" : 1 })> db.test2.aggregate({$group:{_id:"$type",sumsal:{$avg:"$num"}}}){ "_id" : 3, "sumsal" : 12 }{ "_id" : 2, "sumsal" : 7 }{ "_id" : 1, "sumsal" : 2.5 }

如果需要组名

> db.test2.aggregate({$group:{_id:{type:"$type"},sumsal:{$sum:"$num"}}}){ "_id" : { "type" : 3 }, "sumsal" : 60 }{ "_id" : { "type" : 2 }, "sumsal" : 35 }{ "_id" : { "type" : 1 }, "sumsal" : 10 }

多列分组,在原来的基础上在进行分组

固定的字符串,我们只需要定义列名就行咯

> db.test2.aggregate({$group:{_id:{type:"$type","名字":"列名"},sumsal:{$sum:"$num"}}})


广告 广告

评论区