前序
MongoDB的简介我也就不过多的介绍了,如果基本的MongoDB的CRUD操作还不会的兄弟们可以去看看我前一章文章,主要是介绍MongoDB的基本操作的
今日内容
- 谈谈文档之间的关系
- 基础查询
- 分页、排序、投影
- 模糊查询
- Criteria标准查询接口
- 嵌套查询
正文
文档间的关系
一对一(one to one)
在MongoDB中可以通过内嵌文档的方式来体现一对一关系
db.wifeAndHusband.insert([
{
name:"黄蓉",
husband:{
name:"郭靖"
}
}
,{
name:"虞姬",
husband:{
name:"项羽"
}
}])
在嵌套文档中可以存放单个字段,也可以存放对象,结构比较自由
一对多(one to many) / 多对一(many to one)
//创建一个Users集合
db.users.insert([{username:"张三"},{username:"李四"}])
//创建order集合
db.order.insert({
list:["苹果","香蕉","草莓"],
user_id:"627a5e1d3751000061006f14"
});
db.order.insert({
list:["西瓜","哈密瓜","甜瓜"],
user_id:"627a5e1d3751000061006f15"
});
user_id对应的是users集合中用户的_id属性
//通过用户的_id来查询订单集合中的数据
var uid =db.users.findOne({username:"张三"})._id;
db.order.find({user_id:uid+""});
多对多(many to many)
//一个学生有多个老师,多个老师也能有多个学生
db.stus.insert([{name:"郭靖",tech_ids:[
"626ba548035400000101876b","626ba548035400000101876c"
]}])
db.stus.insert([{name:"悟饭",tech_ids:[
"626ba548035400000101876b","626ba61e0354000001018770"
]}])
基础查询
查询所有
db.collection.find({}) 返回的数组
- find()用来查询所有符合条件的文档
- find()可以接收一个对象作为条件参数
- {}表示查询集合中所有的文档
条件查询
多个条件一起查询
查询集合中符合条件的第一个文档对象
db.collection.findOne() 返回的文档对象
分页查询
count()
不带条件,表示查询的所有数据条数
limit()
返回指定条数得到记录
skip()
传一个数字作为跳过的记录条数
limit+skip配合使用
排序
sort()
排序的规则:升序 1 降序 -1
//按照时间排序,排序规则是升序
db.book.find().sort({data:1})
投影
投影意思是只选择必要的数据而不是选择一个文件的数据的整个信息,其实就是类似于mysql指定字段查询
如果没有指定隐藏_id属性是会默认显示的
1:表示显示,0:表示隐藏
模糊查询
$regex() 为查询中的模式匹配字符串提供正则表达式功能 。
还有一种更加简洁的方式
还有几种结合正则表达式的写法
//查询以某字段开头的文档
db.collection.find({"字段名":{$regex:/^XXX/}})
//查询以某字段结尾的文档
db.collection.find({"字段名":{$regex:/XXX^/}})
//查询忽略大小写
db.collection.find({"字段名":{$regex:/XXX/i}})
Criteria标准查询接口
Criteria(标准、条件)是标准的查询接口,可以引用静态Criteria.where的把多个条件组合在一起,就可以轻松的将多个方法连接起来,方便我们操作查询语句
Criteria | MongoDB | 说明 |
---|---|---|
Criteria and(String key) | $and | 并且 |
Criteria andOperator(Criteria…criteria) | $and | 并且 |
Criteria orOperator(Criteria…criteria) | $or | 或者 |
Criteria gt(Object o) | $gt | 大于 |
Criteria gte(Object o) | $gte | 大于等于 |
Criteria in (Object…o) | $in | 包含 |
Criteria is(Object o) | $is | 等于 |
Criteria it(Object o) | $lt | 小于 |
Criteria ite(Object o) | $ite | 小等于 |
Criteria nin(Object…o) | $nin | 不包含 |
数据准备
//向numbers插入2W条数据
var arr =[];
for(var i=1;i<=20000;i++){
arr.push({num:i});
}
db.numbers.insert(arr);
1、查询numbers中num大于5000的文档
2、查询numbers中num大于40小于50文档
//多条件时使用逗号相隔开
db.numbers.find({num:{$gt:40,$lt:50}})
3、查询numbers集合中的前十条数据
其余的规则都可以按照这个规则来自行测试
嵌套查询
样本数据
db.users.insert({username:"张三"});
db.users.update({username:"张三"},{$set:{hobby:
{cities:["beijing","shanghai","shenzhen"],
movies:["sanguo","hero"]}}});
如果要通过内嵌文档来对文档进行查询,此时属性名必须使用引号
删除内嵌文档中的数据
在内嵌文档中新增数据
第一种:
第二种:
$push用于向数组中添加新的元素
$addToSet 向数组中添加一个新元素
两者的区别: 前者,如果添加了还能再添加重复的,后者,如果添加不能再添加,不能添加重复的
结尾
本章博客主要带来的是MongoDB的查询功能,任何一个数据库CRUD操作中,主要难点在于对数据的查询,希望各位能对此多练习实操,希望本章能对兄弟们带来帮助,下章带来的知识点内容是MongoTemplent类的基本使用