首页

7.2查询子文档或数组中的数据

关灯 护眼    字体:

上一章 章节列表 下一章


如果MongoDB的字段中包含子文档或者数组,则查询方式和查询普通的字段有一些区别。



7.2.1 认识嵌入式文档


MongoDB作为NoSQL,储存的数据可以是各种可以的格式。

例如,把下面这一段数据保存到MongoDB中:

导入以后得到的example_data_2数据集如图7-7所示。

图7-7 example_data_2数据集:字段中嵌套字典

在这个数据集中,“user”称为嵌入式文档(Embedded Document),“user”下面的字段称为嵌套字段(Nested Field)。

如要查询嵌套字段,则需要使用点号来指定具体的字段名,格式如下:

嵌入式文档名.嵌套字段名



7.2.2 实例16:嵌入式文档的应用


实例描述

对于数据集example_data_2,执行以下操作:

(1)查询user_id为102的数据。

(2)查询所有“followed”大于10的数据。

(3)查询数据,并只返回“name”和“user_id”这两个字段。

1.使用点号定位嵌套字段

例如,在数据集example_data_2中,查询user_id为102的数据。

使用点号定位到嵌套字段user中的子字段user_id为102的数据,语句为:

db.getCollection('example_data_2').find({'user.user_id': 102})

结果如图7-8所示。

图7-8 使用点号查询嵌入字段

嵌入字段只是定位的时候多了一步。除此之外,嵌入字段和普通字段没有区别。

例如,查询所有“followed”大于10的数据的语句如下:

db.getCollection('example_data_2').find({'user.followed': {'$gt': 10}})

查询结果如图7-9所示。

图7-9 查询“followed”大于10的数据

2.返回嵌套字段中的特定内容

如需要在返回的查询结果中只显示嵌入式文档中的部分内容,也可以使用点号来实现。例如只返回“name”和“user_id”这两个字段,那么查询语句见代码7-3。

代码7-3 使用$project关键字返回嵌套字段中的特定内容

查询结果如图7-10所示。

图7-10 只返回嵌入式文档的部分信息

查询的结果还是一个嵌入式文档,但是只包含需要的字段。在学习了7.3节的内容以后,可以把嵌入式字段变为普通字段。

提示:

对于嵌套字段下面还有嵌入式文档的情况(类似于Python字典套字典),如要查询内层的字段,则继续使用点号即可。例如:

user.work.boss



7.2.3 认识数组字段


Python的列表被写入到MongoDB中就会变成数组(Array),要查询数组中的内容,又有一套自己的方法。有如下数据:

插入MongoDB后得到example_data_3数据集,如图7-11所示。

图7-11 example_data_3数据集

读数组的操作,无外乎以下几种情况:

(1)数组包含或者不包含某些数据。

(2)数组长度。

(3)数组中特定位置的数满足某些条件。



7.2.4 实例17:数组应用——查询数组包含与不包含“××”的数据


实例描述

在数据集example_data_3中进行如下查询:

(1)查询所有size包含M的记录。

(2)查询所有size不包含M的记录。

(3)查询price至少有一个元素在200~300范围中的记录。

1.查询数组包含与不包含数据

(1)查询数组包含数据。

要查出所有“size”包含“M”的数据,查询语句为:

db.getCollection('example_data_3').find({'size': 'M'})

查询结果如图7-12 所示。

图7-11 查出所有“size”包含“M”的数据

从图7-12可以看出,查询所有某个数组包含某个数据的记录,在写法上完全等同于“查询一个普通字段等于某个值的所有记录”。

(2)查询数组不含数据。

查询所有某个数组不包含某个数据的记录,写法如下:

db.getCollection('example_data_3').find({'size': {'$ne': 'M'}})

查询结果如图7-12所示。

图7-12 数组size不包含M的所有记录

2.数组中至少有一个元素在另一个范围空间内

查询所有满足要求的记录:这些记录中有一个数组,数组中至少有一个元素在某个范围内。写法和“查询某个范围内的普通字段”完全一样,例如:

db.getCollection('example_data_3').find({'price': {'$lt': 300, '$gte': 200}})

查询结果如图7-13所示。

图7-13 price数组中至少有一个数据在200(含)~300之间




m.qiduwx.com提示您,本章没有阅读完,点击下一页进入下一页阅读!

上一章 章节列表 下一章