MongoDB的CRUD操作简析(2)

除了使用具体的字段来过滤,我们还可以使用查询操作符来做更加灵活的操作。我们现在需要查找出标题是"Third Post"或"Fifth Post"这两篇Post中的任何一篇,我们可以使用$in操作符来查询:

除了使用$in,MongoDB还提供了很多有用的操作符来帮助构造过滤条件,如 $lt, $gt, $and, $or等。

3.1 使用子Document中值作为过滤条件

现在,我们假设有一篇文章,在Document中的存储如下:

MongoDB的CRUD操作简析

现在,我们需要匹配内部Document中的条件,比如我们需要查找author中name是Duke的记录,我们可以这样构造我们的筛选条件:

db.post.findOne( { "author": { "name": "Duke", "email": "740313507@qq.com" } })

查询结果就是这样的

MongoDB的CRUD操作简析

我们观察这个过滤条件,发现和上面的过滤条件的结构一样,就是{"field":"value"}的格式,只是不同的是,这次的"value"不再是一个普通的值了,而是一个Document。通过这种方式来过滤,具有一些局限性,我们如果要查找author中name是Duke的记录,我们必须完整指定author的值,也就是需要完整的Document。如果需要只过滤name,而不关系email的值,我们可以这样构造过滤条件:

db.post.findOne({"author.name": "Duke"})

查询到和上面一样的结果

MongoDB的CRUD操作简析

但是,这次我们使用了"author.name"的方式来指定field。这种类似于成员引用的"点符号"结构的查询,可以用来对内嵌的Document中的指定的field进行过滤。后面你将会看到,对于数组类型的值,也可以通过类似的方式来构造过滤条件。

3.2 使用数组中的元素作为过滤条件

接下来我们看下如何使用数组中的值来构造过滤条件。最简单的,也是最容易想到的,就是把整个数组作为过滤条件,类似于上面的把整个子Document作为过滤条件一样,我们可以这样构造

db.post.findOne({"comments": ["comment one", "comment two"]})

查询的结果如下:

MongoDB的CRUD操作简析

但是,这种方式没法指定数组中的某个值作为过滤条件。如果要使用数组中的某个值作为过滤条件,我们可以这么构造过滤条件:

db.post.find({"comments": "comment two"})

查询到的结果如下:

MongoDB的CRUD操作简析

这里最后使用了"pretty()"方法来格式化输出,输出格式化的数据,便于观察,仅此而已,没有别的用途。我们可以看到,这种方式构造的过滤条件,使用了数组中的一个元素来筛选记录,只要数组中包含了这个元素(不管这个元素的下标),那么就会过滤出这条记录,有点像集合中的in操作。这种方式可以匹配数组中的一个元素。

接下来,我们更近一步,我们需要匹配数组的某一个下标位置的元素,那么我们需要使用上面一开始提到的,使用类似匹配子Document的那种成员引用(点符号)方式来构造过滤条件:

db.post.find({"comments.0": "comment two"})

查询到的结果如下:

MongoDB的CRUD操作简析

这里,我们使用{"comments.0": "comment two"}的方式指定匹配的条件是:数组"comments"下标为0的位置的值为"comment two"。这样,就可以过滤掉之前下标为1的位置为"comment two"的记录了。可以看出,在使用数组下标构造过滤条件的时候,下标是从0开始的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/27493bd5b522dfa6f9b08845f484494a.html