千家信息网

MongoDB之数据查询(数组)

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,首先在MongoDB里面是支持数组保存的,一旦支持了数组保存,就需要针对于数组的数据进行匹配。范例:保存一部分数组内容db.emp.insert({"name":"刘A","sex":"男","age
千家信息网最后更新 2026年10月31日MongoDB之数据查询(数组)首先在MongoDB里面是支持数组保存的,一旦支持了数组保存,就需要针对于数组的数据进行匹配。

范例:保存一部分数组内容
db.emp.insert({"name":"刘A","sex":"男","age":35,"sal":8000,"loc":"北京","course":["语文","数学","英语","音乐","政治"]});
db.emp.insert({"name":"刘B","sex":"男","age":35,"sal":8000,"loc":"北京","course":["语文","数学"]});
db.emp.insert({"name":"刘C","sex":"男","age":35,"sal":8000,"loc":"北京","course":["语文","数学","英语"]});
db.emp.insert({"name":"刘D","sex":"男","age":35,"sal":8000,"loc":"北京","course":["语文","数学","政治"]});
db.emp.insert({"name":"刘E","sex":"男","age":35,"sal":8000,"loc":"北京","course":["语文","政治"]});

> db.emp.find().pretty();
{
"_id" : ObjectId("599108423268c8e84253be26"),
"name" : "赵一",
"sex" : "男",
"age" : 30,
"sal" : 1000,
"loc" : "北京"
}
{
"_id" : ObjectId("599108423268c8e84253be27"),
"name" : "钱二",
"sex" : "女",
"age" : 22,
"sal" : 5000,
"loc" : "上海"
}
{
"_id" : ObjectId("599108423268c8e84253be28"),
"name" : "孙三",
"sex" : "男",
"age" : 40,
"sal" : 2000,
"loc" : "深圳"
}
{
"_id" : ObjectId("599108423268c8e84253be29"),
"name" : "李四",
"sex" : "女",
"age" : 30,
"sal" : 7000,
"loc" : "北京"
}
{
"_id" : ObjectId("599108423268c8e84253be2a"),
"name" : "周五",
"sex" : "女",
"age" : 30,
"sal" : 6400,
"loc" : "北京"
}
{
"_id" : ObjectId("599108423268c8e84253be2b"),
"name" : "吴六",
"sex" : "男",
"age" : 30,
"sal" : 2500,
"loc" : "重庆"
}
{
"_id" : ObjectId("599108423268c8e84253be2c"),
"name" : "郑七",
"sex" : "女",
"age" : 50,
"sal" : 4700,
"loc" : "成都"
}
{
"_id" : ObjectId("599108433268c8e84253be2d"),
"name" : "王八",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京"
}
{
"_id" : ObjectId("599129a00184ff511bf02b87"),
"name" : "刘A",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学",
"英语",
"音乐",
"政治"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b88"),
"name" : "刘B",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b89"),
"name" : "刘C",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学",
"英语"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b8a"),
"name" : "刘D",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学",
"政治"
]
}
{
"_id" : ObjectId("599129a20184ff511bf02b8b"),
"name" : "刘E",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"政治"
]
}

此时的数据包含有数组内容,而后需要针对数组数据进行判断,可以使用几个运算符:$all、$size、$slice、$elemMatch

范例:查询同时参加语文和数学课程的人员
现在两个数组内容都需要保存,所以使用"{"$all",[内容1,内容2,...]}"
> db.emp.find({"course":{"$all":["语文","数学"]}}).pretty();
{
"_id" : ObjectId("599129a00184ff511bf02b87"),
"name" : "刘A",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学",
"英语",
"音乐",
"政治"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b88"),
"name" : "刘B",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b89"),
"name" : "刘C",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学",
"英语"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b8a"),
"name" : "刘D",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学",
"政治"
]
}
现在所有显示的人员信息里面包含语文和数学的内容。而如果差一个内容的不会显示。
虽然"$all"计算可以用于数组上,但是也可以用于一个数据的匹配上。

范例:查询位置是"成都"的人员
> db.emp.find({"loc":{"$all":["成都"]}}).pretty();
{
"_id" : ObjectId("599108423268c8e84253be2c"),
"name" : "郑七",
"sex" : "女",
"age" : 50,
"sal" : 4700,
"loc" : "成都"

既然在集合里面现在保存的是数组信息,那么数组就可以利用索引操作,使用"key.index"的方式来定义索引。

范例:查询课程中第二个内容(index=1,索引下标从0开始)为数学的信息
> db.emp.find({"course.1":"数学"}).pretty();
{
"_id" : ObjectId("599129a00184ff511bf02b87"),
"name" : "刘A",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学",
"英语",
"音乐",
"政治"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b88"),
"name" : "刘B",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b89"),
"name" : "刘C",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学",
"英语"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b8a"),
"name" : "刘D",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学",
"政治"
]
}

范例:要求查询出只参加两门课程的人员
使用"$size"来进行数量控制
> db.emp.find({"course":{"$size":2}}).pretty();
{
"_id" : ObjectId("599129a00184ff511bf02b88"),
"name" : "刘B",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学"
]
}
{
"_id" : ObjectId("599129a20184ff511bf02b8b"),
"name" : "刘E",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"政治"
]
}

发现在进行数据查询的时候,只要内容符合条件,数组的内容就全备显示出来,希望控制返回的数量,可以使用"$slice"进行控制。

范例:返回年龄为35岁的所有人员,但是要求只显示两门参加的课程
> db.emp.find({"age":35},{"course":{"$slice":2}}).pretty();
{
"_id" : ObjectId("599108433268c8e84253be2d"),
"name" : "王八",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京"
}
{
"_id" : ObjectId("599129a00184ff511bf02b87"),
"name" : "刘A",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b88"),
"name" : "刘B",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b89"),
"name" : "刘C",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b8a"),
"name" : "刘D",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学"
]
}
{
"_id" : ObjectId("599129a20184ff511bf02b8b"),
"name" : "刘E",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"政治"
]
}
现在只取得了前两门的信息,那么也可以设置负数取出后两门信息。
> db.emp.find({"age":35},{"course":{"$slice":-2}}).pretty();
{
"_id" : ObjectId("599108433268c8e84253be2d"),
"name" : "王八",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京"
}
{
"_id" : ObjectId("599129a00184ff511bf02b87"),
"name" : "刘A",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"音乐",
"政治"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b88"),
"name" : "刘B",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"数学"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b89"),
"name" : "刘C",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"数学",
"英语"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b8a"),
"name" : "刘D",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"数学",
"政治"
]
}
{
"_id" : ObjectId("599129a20184ff511bf02b8b"),
"name" : "刘E",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"语文",
"政治"
]
}
或者只是取出中间部分的信息。
> db.emp.find({"age":35},{"course":{"$slice":[1,2]}}).pretty();
{
"_id" : ObjectId("599108433268c8e84253be2d"),
"name" : "王八",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京"
}
{
"_id" : ObjectId("599129a00184ff511bf02b87"),
"name" : "刘A",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"数学",
"英语"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b88"),
"name" : "刘B",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"数学"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b89"),
"name" : "刘C",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"数学",
"英语"
]
}
{
"_id" : ObjectId("599129a00184ff511bf02b8a"),
"name" : "刘D",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"数学",
"政治"
]
}
{
"_id" : ObjectId("599129a20184ff511bf02b8b"),
"name" : "刘E",
"sex" : "男",
"age" : 35,
"sal" : 8000,
"loc" : "北京",
"course" : [
"政治"
]
}
在此时设置的两个数据里面,第一个数据表示开始的位置,第二个数据表示个数。
北京 数学 语文 政治 数组 英语 内容 数据 信息 范例 查询 人员 音乐 王八 课程 成都 索引 控制 两个 位置 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云南咖啡 新华互联网科技学校 上海挚品互联网科技 浩特互联网科技 鑫亿盛互联网科技 上海卓越科技 互联网 上海亿帐通互联网科技 成都仁贤领冠互联网科技有限公司 互联网大会黑科技排名 来此购互联网科技有限公司 互联网科技与大数据专业 深圳育鹏互联网科技有限公司招聘 伊宁互联网科技做什么的 沐思想互联网科技有限公司 郑州欣桑互联网科技有限公司 抖集互联网科技技术咨询 互联网公司属于科技吗 银川新华互联网科技学校原画 互联网科技的前景 宁波允成互联网科技有限公司 互联网科技园 河南云网互联网络科技有限公司 美国互联网保险保险科技 金融科技 互联网金融 甘肃拓世互联网科技有限公司 互联网科技热点资讯 汽车互联网创新科技园 济南小医互联网科技有限公司招聘 广州梦谷互联网科技有限公司领导 上海互联网科技园景观
0