mongodb文档操作——查询

mongodb文档操作——查询

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完成。

  1. in:field:{$in:[condition1,...]}
  2. or:$or:[{field:condition1},...]
db.emp.find(
    {
    
    
        'job': {
    
    
            $in: ['MANAGER', 'CLERK']
        }
    }
);
db.emp.find({
    
    
    $or: [{
    
    
        'job': 'MANAGER'
    }, {
    
    
        'job': 'CLERK'
    }]
})

在这里插入图片描述

4. 查询10号部门工资大于2000的员工。

  1. $gt:大于
  2. $lt:小于
  3. $eq:等于
  4. $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])

在这里插入图片描述

  1. 利用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$/
}})

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_51553982/article/details/129975158