欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MongoDB高级查询

程序员文章站 2022-03-09 09:05:06
...

MongoDB增删改查

一、 MongoDB插入数据insert、save(stu为集合名称)


db.stu.insert({})插入数据,_id存在就报错,否则插入数据。
db. stu.save({})插入数据,_id存在会更新,否则插入数据。

二、 MongoDB的更新操作update

- 方法:db.stu.update(<query>,<upate>,{multi:<boolean>})
参数说明:
query:查询条件
update:更新操作符,$set等,$set指定一个键的值。
multi:可选,默认为false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新。

数据示例:
把name为xiaowang的数据(整体)替换为{name:”xiaozhang”},只更新一条,且更新整条数据,替换原有数据。


db.stu.update({name:”xiaowang”},{name:”xiaozhang”}) #将满足条件的文档修改为{name:”xiaozhang”}

把name为xiaowang的数据中键为name的值更新为xiaozhang,只更新一条,更新数据中部分对象。


db.stu.update({name:”xiaowang”},{$set:{name:”xiaozhang”}}) #仅仅将满足条件的一条文档的name值修改

其中{multi:true}达到更新满足条件的全部数据的目的。


db.stu.update({name:”xiaozhang”},{$set:{name:”xiaohong”}},{multi:true}) #更新所有满足条件的文档

三、 MongoDB删除

方法:db.stu.remove(<query>,{justOne:<boolean>})
参数说明:
query:可选,删除的文档的条件。
justOne:可选,如果设为true或1,则只删除一条,默认false,表示删除满足条件的全部即多条数据。

数据示例:

db.stu.remove({name:”xiaohong”}),默认情况会删除所有满足name为”xiaowang”条件的数据.
db.stu.remove({name:”xiaohong”},{justone:true}),达到只删除一条满足条件的数据即可。
补充:
db.dropDatabase()	//删除当前所在数据库
db.collectionName.drop()	//删除集合
db.collectionName.remove({})	//清空集合

MongoDB高级查询

db.stu.find(<query>,<projection>)
参数说明:
query:可选,使用查询操作符,指定查询条件
projection:指定使用投影运算符返回的字段,省略此参数返回匹配文档中的所有字段,1或者true表示返回字段,
			  0或者false表示不返回该字段。
Projection语法:{filed1:<boolean>,filead2:<boolean>,...}
说明:_id默认就是1,没指定该返回字段时,默认会返回,除非设置为0,就不会返回该字段。

MongoDB高级查询
一、 条件查询find()

1、方法find():
操作:db.stu.find({条件文档}),查询,返回满足条件的记录。

2、方法findOne():
操作:db.stu.findOne({条件文档}),查询,只返回满足条件的第一个

3、方法pretty():
操作:db.stu.find({条件文档}).pretty(),将结果格式化,美化输出。


查询年龄为10时:db.stu.find({age:10})

查询年龄为10,只返回一条数据db.stu.findOne({age:10})

查询年龄为10的数据,格式化输出:db.stu.find({age:10}).pretty()

比较查询运算符

二、 比较运算符$lt、$gt、$lte、$gte、$ne


小于:$lt(less than)匹配小于指定值的值。 
大于:$gt (greater than)匹配大于指定值的值。 
小于等于:$lte (less than equal)匹配小于或等于指定值的值。 
大于等于:$gte (greater than equal)匹配大于等于指定值的值。 
不等于:$ne (not equal)匹配不等于指定值的值。 
等于:$eq (equal) 匹配等于指定值的值。 

数据示例:


查询年纪大于18岁:db.stu.find({age:{$gte:18}})

查询年龄大于18岁小于25岁:db.stu.find({age:{$gte:18,$lte:25}}) 

查询年龄不等于18岁的学生:db.stu.find({age:{$ne:18}})  

逻辑查询运算符

三、 逻辑运算符$and与$or


$and:返回所有符合两个子句条件的文档。
$or:返回与任一子句的条件匹配的所有文档,值为数组,数组每个元素为json格式,注意用list。

示例数据:

$or-->查询年龄大于18或家乡在河南的学生。
	db.stu.find({$or:[{age:{$gt:18}},{home:”henan”}]})$or-->查询年龄大于18或性别为男生,and-->姓名是小明的学生。
	db.stu.find({$or:[{age:{$gt18}},{gender:"nan"}],name:”xiaoming”})

评估查询操作符


$mod:对字段的值执行模块化操作,并选择具有指定结果的文档,主要用于判断键值奇偶性
$where:匹配满足JavaScript表达式的文档。

一、$mod:选择字段的值除以除数的值具有指定余数的文档(即执行模块操作以选择文档)。


语法格式:{ field: { $mod: [ divisor, remainder ] } }

创建一个集合inventory附下列文件


{ "_id" : 1, "item" : "abc123", "qty" : 0 }
{ "_id" : 2, "item" : "xyz123", "qty" : 5 }
{ "_id" : 3, "item" : "ijk123", "qty" : 12 }

创建一个集合media附下列文件


{"Type":"Book","Title":"Definitive Guide to MongoDB 3rd","ISSBN":"978-1-4842-1183-0","Publisher":"Appress","Author":["Hows","Plugge","Membrey","Hawkins"]}
{"Type":"CD","Artist":"Nirvana","Title":"Nevermind","Tracklist":[{"Track":"1","Title":"smells like spirit","length":"5:02"},{"Track":"2","Title":"In Bllom","length":"4:15"}]}
{"Type":"DVD","Title":"Blade Runner","Released":1982}
{"Type":"DVD","Title":"Mateix","Released":1999,"Cast":["Carrie","Laurence","Hugo","Joe","Foster"]}
{"Type":"DVD","Title":"Toy Story3","Released":2010}

数据示例:
1、查询在inventory集合中,qty值模4等于0的字段


db.inventory.find( { qty: { $mod: [ 4, 0 ] } } )

返回结果:
{ "_id" : 1, "item" : "abc123", "qty" : 0 }
{ "_id" : 3, "item" : "ijk123", "qty" : 12 }

2、查询media集合中,返回对Released属性为偶数的字段
MongoDB高级查询
3、返回对Released属性为奇数的字段
MongoDB高级查询
二、$regex以及//模式匹配正则表达式功能

语法格式:
1、{ <field>: { $regex: /pattern/<options> } }
2、{ <field>: /pattern/<options> } //使用正则表达式对象(/pattern/)指定正则表达式
参数说明:
/pattern/指要匹配的字符
<options>:一般为i,指对大小写不敏感
例如:查询姓黄的学生
	db.stu.find({name:/^黄/})
	db.stu.find({name:{$regex:’^黄’}})(红字不加也行)

三、$where操作符

使用$where后面写一个函数,返回满足条件的数据查询年龄大于30的学生
操作:db.stu.find({$where:function(){return this.age>30}})

数组查询运算符

操作符 描述
$all 匹配包含查询中指定的所有元素的数组
$elemMatch 如果数组字段中的元素匹配所有指定的$elemMatch条件。
$size 如果数组字段为指定大小,则选择文档。

一、$all运算符查询

语法格式:{ <field>: { $all: [ <value1> , <value2> ... ] } }

MongoDB高级查询

二、 匹配完整的数组以及$elemMatch查询数组
https://docs.mongodb.com/manual/reference/operator/query/elemMatch/index.html

$elemMatch 数组查询操作用于查询数组值中至少有一个能完全匹配所有的查询条件的文档。
语法格式:{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }
注:如果只有一个查询条件就没必要使用 $elemMatch

1、元素匹配
实验数据:
MongoDB高级查询
例如:查询只匹配results数组至少包含一个大于或等于80而且小于85
MongoDB高级查询
MongoDB高级查询
2、嵌入文档数组

创建survey集合
{ _id: 1, results: [ { product: "abc", score: 10 }, { product: "xyz", score: 5 } ] }
{ _id: 2, results: [ { product: "abc", score: 8 }, { product: "xyz", score: 7 } ] }
{ _id: 3, results: [ { product: "abc", score: 7 }, { product: "xyz", score: 8 } ] }

例如:下面的查询只匹配结果数组中至少包含一个product等于“xyz”且得分大于或等于8的元素的文档。

db.survey.find(
   { results: { $elemMatch: { product: "xyz", score: { $gte: 8 } } } }
)
返回结果:
{ "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "xyz", "score" : 8 } ] }

2、单查询条件
注:如果在$elemMatch表达式中指定单个查询条件,则不需要$elemMatch。

例如,查询survey集合中字段为的{ product: "xyz" }文档
db.survey.find(
   { results: { $elemMatch: { product: "xyz" } } }
)
-->使用点号可以达到同样的效果
db.survey.find(
   { "results.product": "xyz" }
)

MongoDB高级查询
MongoDB高级查询
使用点号匹配
MongoDB高级查询
使用$elemMatch匹配数组,注意此时其字典内容属于同一字段的键值
MongoDB高级查询
补充:
$elemMatch查询数组时,其字典内容必须属于同一字段的键值,否则则查询为空。
MongoDB高级查询

三·、$size匹配指定一定数目的数组

作用:\$size操作符匹配参数指定的元素数量的任何数组。
语法格式:db.collection.find( { field: { $size: 2 } } ),返回的文档collection里field是一个包含两个元素的数组。
例如,上面的表达式将返回{ field: [ red, green ] }{ field: [ apple, lime ] }
但不返回{ field: fruit }{ field: [ orange, lemon, grapefruit ] }。若要将字段与数组中的一个元素匹配,请使用$size值为1,如下所示:
db.collection.find( { field: { $size: 1 } } )

MongoDB高级查询

元素查询运算符

名字 描述
$exists 匹配具有指定字段的文档。
$type 如果字段为指定类型,则选择文档。

一、$type如果字段是指定的类型,则选择文档
MongoDB高级查询

二、$exists匹配具有指定字段的文档


语法格式:{ field: { $exists: <boolean> } }
参数:当<boolean>为真时,$exists匹配包含字段的文档,(包括字段值为空的文档。)如果<boolean>为false,则查询只返回不包含该字段的文档。

1、$exists:true

例如:查询选择inventory集合中的所有文档,其中qty字段存在且其值不等于5或15。
db.inventory.find( { qty: { $exists: true, $nin: [ 5, 15 ] } } )

例如:返回media集合中含有Author的字段,只显示Author
MongoDB高级查询

2、$exists:false
例如:返回media集合中不含有Author的字段,只显示Type属性

MongoDB高级查询

其他操作符

limit和skip使用

方法limit():用于读取指定数量的文档
	db.stu.find().limit(n),n-->指数目。
例如:查询两条学生的信息。
	db.stu.find().limit(2)

方法skip():用于跳过指定数量的文档,表示偏移量。
	db.stu.find().skip(n),n-->指数目。
例如:跳过2条文档
	db.stu.find().skip(2)

同时使用类似于翻页操作
	db.stu.find.limit(4).skip(5)或db.stu.find().skip(5).limit(4)
注:建议先skip在使用limit。

二、投影选择返回结果的字段

方法:db.stu.find({条件},{字段名称:1,2…}),
其中条件不写表示显示全部,参数字段为键与值,值为1表示显示,不写不显示。特殊情况下,对于_id列是默认显示的,
如果不显示需要明确设置为0,在查询到的返回结果中,只选择必要的字段。
例如:查询返回所有学生的姓名、性别且不显示_id
db.dtu.find({},{_id:0,name:1,gender:1}),
表示显示name和gender属性的所有数据,因为条件为空,返回所有字段,且_id不显示

四、 排序sort和计数count的用法

方法sort(),用于对集合进行排序
db.stu.find().sort({键:1,……}),参数1代表升序,-1代表降序。
例如:根据性别降序,再根据年龄升序。
db.stu.find().sort({gender:-1,age:1})

方法count()用于统计结果集中文档条数
方法一:db.stu.find({条件}).count()
方法二:db.stu.count(条件),两者作用相同

例如:统计stu集合里,性别为男的个数
db.stu.find({gender:‘男’}).count()
例如:统计stu集合里,年龄大于20的,gender为男的个数
db.stu.count({age:{$gt:20},gender:”男”})

五、distinct()查询去重

方法:db.stu.distinct(“去重键值”,{条件}),对数据进行去重,返回一个数组。
示例数据:
例如:stu集合中年龄大于18的人home来自哪里
db.stu.distinct(“home”,{age:{$gt:18}})

六、KaTeX parse error: Expected '}', got 'EOF' at end of input: …atrix"},{Cast:{slice:num}),Cast数组下标从零开始.
MongoDB高级查询

  • 当num为一个正整数时,表示从左边开始显示num个元素

例如:显示数组前两个元素。
MongoDB高级查询

  • 当num为一个负整数表示从右边开始显示num个元素

例如:显示数组后两个元素。
MongoDB高级查询

  • 当num的值为一个列表[n1,n2]时,n1表示从下标为n1的数组开始,取出n2个元素。

例如:从下标为2的元素开始,显示2个元素。
MongoDB高级查询
例如:从下标为2的元素开始,显示3个元素。
MongoDB高级查询

  • 当n1的值为负时,表示从右边为起点的数组下标,n2表示显示的元素个数。

例如:当数组下标用负数表示时的情形。
MongoDB高级查询
例如:从下标为-5开始,显示3个元素。
MongoDB高级查询
六、范围运算符”$in”(包含)、”$nin”(不包含)

使用”$in”,”$nin”判断是否在某个范围内,注意用list即[]
$in用法:{ field: { $in: [<value1>, < value2>, ...] } }
参数field为键名,<value1>为值

$nin用法:{ field: { $nin: [<value1>, < value2>, ...] } }
参数field为键名,<value1>为值

示例数据:

例如:年龄为18、28的学生:
db.stu.find({age:{$in:[18,28]}})
例如:查询年龄为20,23岁的人:
db.stu.find({age:{$in:[20,23]}})
例如:查询年龄不在20,23岁的学生:
db.stu.find({age:{$nin:[20,23]}})

结论:$in用法跟$or有点像,但$or作为条件查询时,可以指定不同的字段,而$in只针对一个字段。

例:查询年龄为18或者姓徐的学生:db.stu.find({$or:[{"name ":"xu"},{"age":"18"}]}]})
例:查询年龄为18、10、20的学生:db.stu.find({age:{$in:[18,19,20]}})