当先锋百科网

首页 1 2 3 4 5 6 7

前序

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的把多个条件组合在一起,就可以轻松的将多个方法连接起来,方便我们操作查询语句

CriteriaMongoDB说明
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类的基本使用