来源:我的博客站 OceanicKang |《MongoDB 数据操作(二)数据查询(6)数组查询》
上一篇:《MongoDB 数据操作(二)数据查询(5)范围查询》
在 MongoDB 中支持数组保存,而一旦支持数组保存,就需要针对于数组的数据进行匹配
保存数组内容
> db.students.update({"name":"张三"}, {"$set": {"course": ["语文", "数学", "英语"]}});
> db.students.update({"name":"李四"}, {"$set": {"course": ["物理", "化学", "生物"]}});
> db.students.update({"name":"王五"}, {"$set": {"course": ["地理", "政治", "历史"]}});
> db.students.update({"name":"赵六"}, {"$set": {"course": ["语文", "政治", "历史"]}});
> db.students.update({"name":"燕七"}, {"$set": {"course": ["物理", "生物", "地理"]}});
> db.students.update({"name":"孙八"}, {"$set": {"course": ["数学", "化学", "生物"]}});
> db.students.update({"name":"刘九"}, {"$set": {"course": ["政治", "化学", "生物"]}});
> db.students.insert({"name":"牛十", "course": ["物理", "生物"]});
对原有数据进行更新,添加 course
字段,值为数组
而后需要针对数组进行判断,可以使用几个运算符:$all
、$size
、$slice
、$elemMathch
查询同时参加语文和数学课程的学生:
{ "$all": [内容1, 内容2, ...] }
> db.students.find({"course": {"$all": ["语文", "数学"]}}).pretty();
虽然 $all
不仅可以用于数组上,还能用于一个数据的匹配上
查询学生地址是“鄞州区”的信息
> db.students.find({"address": {"$all": ["鄞州区"]}}).pretty();
在集合中保存的数组信息,可以利用索引操作,用 key.index
的方式来定义索引
查询数组中第二个内容(index = 1)为数学的信息
> db.students.find({"course.1": "数学"}).pretty();
查询只参加两门课程的学生
使用 $size
来进行数量控制
> db.students.find({"course": {"$size": 2}}).pretty();
返回年龄为 19 的所有学生的信息,但是要求只显示前两门参加课程
在进行数据查询的时候,只要是内容符合条件,数组的内容就全部显示出来了
现在希望可以控制数组返回的数量,使用 $slice
进行控制
> db.students.find({"age": 19}, {"course": {"$slice": 2}}).pretty();
如果设置负数,可以取出后两门的信息
返回年龄为 19 的所有学生的信息,但是要求只显示后两门参加课程
> db.students.find({"age": 19}, {"course": {"$slice": -2}}).pretty();
返回年龄为 19 的所有学生的信息,但是要求显示跳过第一门后的课程,返回一门即可
> db.students.find({"age": 19}, {"course": {"$slice": [1, 1]}}).pretty();
[1, 1]
:第一个数据表示跳过的数据量,第二个数据表示返回的数据量