1):MongoDB查询(基本查询条件操作符介绍)

从前面的学习中,我们得知MongoDB中使用find函数来进行查询。查询最终返回的是一个集合中文档的子集,子集合包括0个文档到这个集合中所有的文档。

【第一个查询参数】

find函数第一个参数是一个文档,其中给出了我们要查询集合中什么样文档的描述。如果我们要查询所有文档,可以不带任何参数调用find函数,或第一个参数为空文档{},如下例:

> db.people.find();{ "_id" : ObjectId("501dffc605f64f64b0765c53"), "age" : 18, "name" : "tom" }{ "_id" : ObjectId("501dffcc05f64f64b0765c54"), "age" : 28, "name" : "jimmy" }{ "_id" : ObjectId("501dffd005f64f64b0765c55"), "age" : 38, "name" : "tim" }> db.people.find({});{ "_id" : ObjectId("501dffc605f64f64b0765c53"), "age" : 18, "name" : "tom" }{ "_id" : ObjectId("501dffcc05f64f64b0765c54"), "age" : 28, "name" : "jimmy" }{ "_id" : ObjectId("501dffd005f64f64b0765c55"), "age" : 38, "name" : "tim" }>

对于第一个代表查询参数的文档,我们该如何理解呢?比如我们执行 db.people.find({"age":18}),这个函数实际表示我们要查询键"age"的值为18的文档,键“age”的值不等于18或不存在这个键的文档均不会被查询到。再比如我们执行这个函数:db.people.find({"name":"jimmy", "age":18}),这个实际表示得是查询键“name”的值为"jimmy"并且键"age"的值为18的文档,即查询文档中各个条件是AND的关系!

在使用第一个参数时,我们需要注意一点:该查询文档中“键值对”中的值必须为常量!

【第二个查询参数】

上例中,我们不指定或只指定find函数第一个参数查询得到的文档,会包含原集合文档所有的键值对。这种情况对于某些键值对特别多的文档并不适用,因为我们可能只关心该文档的某几个键值对。这时我们可以使用find函数的第二个参数,来指定返回的键值对,这样还可以减少传输的数据量从而加快效率。第二个参数同样是个文档,如下例:

> db.people.find({},{"age":1,"name":1});{ "_id" : ObjectId("501dffc605f64f64b0765c53"), "age" : 18, "name" : "tom" }{ "_id" : ObjectId("501dffcc05f64f64b0765c54"), "age" : 28, "name" : "jimmy" }{ "_id" : ObjectId("501dffd005f64f64b0765c55"), "age" : 38, "name" : "tim" }> db.people.find({},{"age":1});{ "_id" : ObjectId("501dffc605f64f64b0765c53"), "age" : 18 }{ "_id" : ObjectId("501dffcc05f64f64b0765c54"), "age" : 28 }{ "_id" : ObjectId("501dffd005f64f64b0765c55"), "age" : 38 }> db.people.find({},{"name":1});{ "_id" : ObjectId("501dffc605f64f64b0765c53"), "name" : "tom" }{ "_id" : ObjectId("501dffcc05f64f64b0765c54"), "name" : "jimmy" }{ "_id" : ObjectId("501dffd005f64f64b0765c55"), "name" : "tim" }> db.people.find({},{"name":1,"_id":0});{ "name" : "tom" }{ "name" : "jimmy" }{ "name" : "tim" }>

使用find函数第二个参数,对于这个文档我们有这些要注意的:

1》 对于非"_id"的所有键,其值要么同时不等于0(表明要查询该键值对),要么同时等于0(表明要忽略该键值对),否则执行报错。

2》 对于非“_id”的所有键,如果其值全部为0,则此时如果也指明了键“_id”的情况,则键“_id”的值必须为0,否则执行报错。

3》 对于键“_id”,如果不指名其值,则查询结果中肯定包含这个键值对,如果不想包含,可以指明其值为0即可。

综上,我们总结一下如果需要使用第二个参数,则使用的技巧为:指明所有需要得到的键的值为非0的数字,如果还要过滤键"_id",则再指明"_id"这个键值为0即可。

【查询条件】

上面提到的查询条件,都是精确匹配,即“=”多少。MongoDB中的查询显然还有更复杂的匹配。比如范围,OR子句和取反等。我们分别进行介绍。

“$lt”、“$lte”、“$gt”、“$gte” 就是所有的范围比较操作符,分别对应<、<=、>、>=。将他们组合应用,就可以查询值在某个范围内的文档了,比如我们要查询18-30岁(含)的所有用户:

> db.people.find({"age":{"$gte":18,"$lte":30}});{ "_id" : ObjectId("501dffc605f64f64b0765c53"), "age" : 18, "name" : "tom" }{ "_id" : ObjectId("501dffcc05f64f64b0765c54"), "age" : 28, "name" : "jimmy" }>

这种范围查询操作符,除用在值为数字的键之上外,对于值为日期的键的范围匹配也尤为好用!比如我们要查询注册日期在2007/05/01前的用户信息,我们可以这样写:

> db.user.find();{ "_id" : ObjectId("5020faf5d6acd1b2a3fb316f"), "name" : "tim", "age" : 40, "registered" : ISODate("2007-03-02T16:00:00Z") }{ "_id" : ObjectId("5020fb08d6acd1b2a3fb3170"), "name" : "tom", "age" : 29, "registered" : ISODate("2009-07-02T16:00:00Z") }{ "_id" : ObjectId("5020fb27d6acd1b2a3fb3171"), "name" : "jimmy", "age" : 18, "registered" : ISODate("2009-09-02T16:00:00Z") }> db.user.find({"registered":{"$lte":new Date("2007/05/01")}});{ "_id" : ObjectId("5020faf5d6acd1b2a3fb316f"), "name" : "tim", "age" : 40, "registered" : ISODate("2007-03-02T16:00:00Z") }>穿过紫堇,穿过木棉,穿过时影时现的悲喜和无常。

1):MongoDB查询(基本查询条件操作符介绍)

相关文章:

你感兴趣的文章:

标签云: