mongodb文档操作——查询
基本查询
准备数据
db.emp.insert(
[
{
_id: 7369,
ename: 'SMITH',
job: 'CLERK',
mgr: 7902,
hiredate: '17-12-80',
sal: 800,
comm: 0,
deptno: 20
},
{
_id: 7499,
ename: 'ALLEN',
job: 'SALESMAN',
mgr: 7698,
hiredate: '20-02-81',
sal: 1600,
comm: 300,
deptno: 30
},
{
_id: 7521,
ename: 'WARD',
job: 'SALESMAN',
mgr: 7698,
hiredate: '22-02-81',
sal: 1250,
comm: 500,
deptno: 30
},
{
_id: 7566,
ename: 'JONES',
job: 'MANAGER',
mgr: 7839,
hiredate: '02-04-81',
sal: 2975,
comm: 0,
deptno: 20
},
{
_id: 7654,
ename: 'MARTIN',
job: 'SALESMAN',
mgr: 7698,
hiredate: '28-09-81',
sal: 1250,
comm: 1400,
deptno: 30
},
{
_id: 7698,
ename: 'BLAKE',
job: 'MANAGER',
mgr: 7839,
hiredate: '01-05-81',
sal: 2850,
comm: 0,
deptno: 30
},
{
_id: 7782,
ename: 'CLARK',
job: 'MANAGER',
mgr: 7839,
hiredate: '09-06-81',
sal: 2450,
comm: 0,
deptno: 10
},
{
_id: 7788,
ename: 'SCOTT',
job: 'ANALYST',
mgr: 7566,
hiredate: '19-04-87',
sal: 3000,
comm: 0,
deptno: 20
},
{
_id: 7839,
ename: 'KING',
job: 'PRESIDENT',
mgr: 0,
hiredate: '17-11-81',
sal: 5000,
comm: 0,
deptno: 10
},
{
_id: 7844,
ename: 'TURNER',
job: 'SALESMAN',
mgr: 7698,
hiredate: '08-09-81',
sal: 1500,
comm: 0,
deptno: 30
},
{
_id: 7876,
ename: 'ADAMS',
job: 'CLERK',
mgr: 7788,
hiredate: '23-05-87',
sal: 1100,
comm: 0,
deptno: 20
},
{
_id: 7900,
ename: 'JAMES',
job: 'CLERK',
mgr: 7698,
hiredate: '03-12-81',
sal: 950,
comm: 0,
deptno: 30
},
{
_id: 7902,
ename: 'FORD',
job: 'ANALYST',
mgr: 7566,
hiredate: '03-12-81',
sal: 3000,
comm: 0,
deptno: 20
},
{
_id: 7934,
ename: 'MILLER',
job: 'CLERK',
mgr: 7782,
hiredate: '23-01-82',
sal: 1300,
comm: 0,
deptno: 10
}
]
);
1. 查询所有的员工信息。
db.emp.find();
2. 查询职位为经理的员工。
db.emp.find({
'job':'MANAGER'});
3. 查询MANAGER或者CLERK员工信息,分别用$in
和$or
完成。
- in:
field:{$in:[condition1,...]}
- or:
$or:[{field:condition1},...]
db.emp.find(
{
'job': {
$in: ['MANAGER', 'CLERK']
}
}
);
db.emp.find({
$or: [{
'job': 'MANAGER'
}, {
'job': 'CLERK'
}]
})
4. 查询10号部门工资大于2000的员工。
- $gt:大于
- $lt:小于
- $eq:等于
- $ne:不等于
db.emp.find({
'sal': {
$gt: 2000
}
})
5. 查询仅显示员工的姓名和部门信息这两个字段。
db.emp.find({
},{
'ename':1,'deptno':1,'_id':0})
嵌套查询
准备数据
db.stu.insertMany([
{
_id: "stu0001",
name: "Mary",
age: 21,
grade: {
chinese: 80,
math: 85,
english: 90
},
books: ["Hadoop", "Java", "NoSQL"]
},
{
_id: "stu0002",
name: "Tom",
age: 20,
grade: {
chinese: 86,
math: 82,
english: 95
},
books: ["C++", "Java", "Oracle"]
},
{
_id: "stu0003",
name: "Mike",
age: 22,
grade: {
chinese: 81,
math: 90,
english: 88
},
books: ["Java", "MySQL", "PHP"]
},
{
_id: "stu0004",
name: "Jerry",
age: 20,
grade: {
chinese: 95,
math: 87,
english: 89
},
books: ["Hadoop", "Spark", "Java"]
},
{
_id: "stu0005",
name: "Evan",
age: 19,
grade: {
chinese: 75,
math: 80,
english: 69
},
books: ["C", "Python"]
},
{
_id: "stu0006",
name: "Oven",
age: 19,
grade: {
chinese: 79,
math: 90,
english: 99
},
books: ["C++", "Python"]
},
{
_id: "stu0007",
name: "Lily",
age: 21,
grade: {
chinese: 70,
math: 60,
english: 69
},
books: ["Java", "Spark", "Python"]
},
{
_id: "stu0008",
name: "Kelly",
age: 22,
grade: {
chinese: 70,
math: 64,
english: 67
},
books: ["C", "Spark", "Python"]
}
])
1.查询语文是81分,英语成绩是88分的学生信息。
db.stu.find(
{
'grade.chinese': 81,
'grade.english': 88
}
)
2. 查询语文75分,英语成绩69分,数学成绩是80分的学生信息。
db.stu.find(
{
grade: {
chinese: 75,
math: 80,
english: 69
}
}
)
3. 查询语文成绩大于90分的学生信息。
db.stu.find(
{
'grade.chinese':{
$gt:90}
}
)
4. 查询英语成绩大于88分,数学成绩大于等于85分的学生信息。
db.stu.find(
{
'grade.english':{
$gt:88},
'grade.math':{
$gt:85}
}
)
数组查询
1. 在stu集合中查询所有有Hadoop、Java和Nosql书的学生信息。
db.stu.find(
{
books: {
$all: ["Hadoop", "NoSQL", "Java"]
}
}
)
2. 在stu集合中查询所有有Python和C书的学生信息。
使用$all相当于包含,而不是精准匹配
db.stu.find(
{
books: {
$all: ["C", "Python"]
}
}
)
数组嵌套文档查询
准备数据
var updateBooks = [
[{
"bookname": "Hadoop",
quantity: 2
}, {
"bookname": "Java",
quantity: 3
}, {
"bookname": "NoSQL",
quantity: 4
}],
[{
"bookname": "C++",
quantity: 4
}, {
"bookname": "Java",
quantity: 3
}, {
"bookname": "Oracle",
quantity: 5
}],
[{
"bookname": "Java",
quantity: 4
}, {
"bookname": "MySQL",
quantity: 1
}, {
"bookname": "PHP",
quantity: 1
}],
[{
"bookname": "Hadoop",
quantity: 3
}, {
"bookname": "Spark",
quantity: 2
}, {
"bookname": "Java",
quantity: 4
}],
[{
"bookname": "C",
quantity: 1
}, {
"bookname": "Python",
quantity: 1
}],
[{
"bookname": "Hadoop",
quantity: 1
}, {
"bookname": "MySQL",
quantity: 2
}],
[{
"bookname": "Oracle",
quantity: 3
}, {
"bookname": "Python",
quantity: 3
}],
[{
"bookname": "MySQL",
quantity: 2
}, {
"bookname": "Python",
quantity: 2
}]
]
for (let i = 1; i <= 8; i++) {
db.stu.update(
{
_id: 'stu000' + i,
},
{
$set: {
books: updateBooks[i - 1]
}
}
)
}
1. 查询Java有4本的学生信息。
db.stu.find(
{
books:{
bookname:'Java',
quantity:4
}
}
)
2. 查询数组中第一个元素大于3本的学生信息。
db.stu.find(
{
'books.0.quantity':{
$gt:3
}
}
)
3. 查询文档中至少有一个quantity的值大于4
$elemMatch表示遍历每一个元素
db.stu.find(
{
books: {
$elemMatch:{
quantity:{
$gt:4}
}
}
}
)
利用操作符的查询
插入两条记录。
db.stu.insertMany([
{
_id:"stu0009",name:"Kim",age:null },
{
_id:"stu0010",name:"Max"}
])
1. 查询age值为null的文档,包括age缺失的文档。
db.stu.find(
{
age: {
$in: [
null,
''
]
}
}
)
2. 只返回age值为null的文档。
$type:10就表示null
db.stu.find({
age: {
$type: 10
}
})
db.stu.find(
{
age: {
$in: [null],
$exists: true
}
}
)
3. 检查缺失age字段的文档。
db.stu.find(
{
age: {
$exists: false
}
}
)
4. 查询语文成绩比英语成绩少的文档信息。
db.stu.find(
{
$expr: {
$lt: [
'$grade.chinese',
'$grade.english'
]
}
}
)
游标使用
你可以将游标视作迭代器
1. 将查询stu集合的全部学生信息定义为游标mycursor;
var mycursor = db.stu.find()
2. 使用游标mycursor访问stu集合中的每个文档,并打印;
while(mycursor.hasNext()){
printjson(mycursor.next())
}
mycursor.forEach(function (k){
printjson(k)
})
3. 将游标mycursor转变为数组,并查询数组中第三个文档并输出;
var mycursor = db.stu.find()
printjson(mycursor[2])
- 利用skip和limit实现stu集合的分页查询,每页显示4条文档。
var page = 1
var mycursor = db.stu.find().limit(4).skip(page * 4 + 1)
while(mycursor.hasNext()){
printjson(mycursor.next())
}
查找不同的字段值
查询emp集合中有哪些职位。
db.emp.distinct('job')
正则表达式查询
1.查询stu集合中name字段包含e字符的信息,字符不区分大小写。
db.stu.find(
{
name: {
$regex:"e",
$options: "$i"
}
}
)
2.查询stu集合中name字段包含en字符的信息,字符不区分大小写。
db.stu.find({
name: {
$regex: 'en',
$options: "$i"
}
})
3.查询stu集合中name字段包含e字符但以n字符结尾的文档信息,字符不区分大小写。
db.stu.find({
name: {
$regex: /e.*n$/
}})