开始之前,我们先准备好演示用的数据。这里我插入了几条数据。数据如下:db.user.insertMany([{name:'jack',age:22,sex:'Man',tags:['python','c++','c'],grades:[22,33,44,55],school:{name:'shida',city:'徐州'}},{name:'jhon',age:33,sex:null,tags:['python','java'],grades:[66,22,44,88],school:{name:'kuangda',city:'徐州'}},{name:'xiaoming',age:33,tags:['python','java'],grades:[66,22,44,88],school:{name:'kuangda',city:'徐州'}}])find(,)其中query表示搜索条件,相当于mysql中的where子句,projection列出了你要查找的数据,格式为db.collection.find(find(,))例子:下面不带参数的搜索会找到db.find的所有结果().pretty();//输出结果{"_id":ObjectId("59056f81299fe049404b2899"),"name":"jack","age":22,"tags":["python","c++","c"],"grades":[22,33,44,55],"school":{"name":"shida","city":"xuzhou"}}找出名字为jack的数据,并且只输出姓名、年龄,其中_id是默认输入out,不想输出就设置为0,要输出那个字段就设置为1db.user.find({name:'jack'},{name:1,age:1})//输出结果{"_id":ObjectId("59056f81299fe049404b2899"),"name":"jack","age":22}db.user.find({name:'jack'},{name:1,age:1,_id:0})//输出结果{"name":"jack","age":22}**注意这里一个projection不能同时指定include和exclude字段,exclusion除外在显式包含字段的映射中的_id字段中,_id字段是唯一可以显式排除的字段。查询嵌入文档上例中插入的学校数据表示嵌入文档与查询完全匹配完全匹配查询表示学校中的查询数组必须与插入的数组完全相同,顺序必须相同findoutdb.user.find({name:'jack',school:{name:'shida',city:'徐州'}});//输出结果{"_id":ObjectId("59056f81299fe049404b2899"),"名称":"杰克","年龄":22,"标签":["python","c++","c"],"成绩":[22,33,44,55],"学校":{"name":"shida","city":"xuzhou"}}//下面是指定的输出字段,其中school.name表示只输出学校文档中的name字段,必须加引号db.user.find({name:'jack',school:{name:'shida',city:'徐州'}},{name:1,age:1,'school.name':1});//输出结果{"_id":ObjectId("59056f81299fe049404b2899"),"name":"jack","age":22,"school":{"name":"shida"}}键值对查询即可查询通过键值对,不考虑顺序,例如'school.name':'shida'表示查询学校名称为shida的数据,这里的引号是必须的db.user.find({'school.name':'shida'},{name:1,school:1});//输出结果{"_id":ObjectId("59056f81299fe049404b2899"),"name":"jack","school":{"name":"shida","city":"xuzhou"}}查询算子接下来我们配合查询算子进行复杂的Query元素查询、逻辑查询、比较查询等操作下面我们使用比较运算符"$gt","$gte","$lt","$lte"(分别对应">",">=","<","<=")的例子来查询20-30岁的信息db.user.find({age:{$gt:20,$lt:30}})//输出{"_id":ObjectId("59056f81299fe049404b2899"),"name":"jack""age":22,"tags":["python","c++","c"],"grades":[22,33,44,55],"school":{"name":"shida","city":"徐州"}}$ne$ne表示不相等,例如查询年龄不等于22的信息db.user.find({age:{$ne:22}})//输出{"_id":ObjectId("59057c16f551d8c9003d31e0"),"name":"jhon","age":33,"tags":["python","java"],"grades":[66,22,44,88],"school":{"name":"kuangda","city":"xuzhou"}}slice$slice运算符控制查询返回的数组中元素的数量。该运算符根据参数{field:value}指定的键名和键值选取文档集合,文档集合中指定的数组键将返回指定数量的元素。如果count的值大于数组中元素的个数,则查询返回数组中的所有元素。语法:db.collection.find({field:value},{array:{$slice:count}});下面将查询成绩中的前两个数字db.user.find({name:'jack'},{grades:{$slice:2},name:1,age:1,'school.name':1});//输出,可以看出这里的成绩只输出前两个{"_id":ObjectId("59057c16f551d8c9003d31df"),"name":"jack","age":22,"grades":[22,33],"school":{"name":"shida"}}下面会输出最后三个Datadb.user.find({name:'jhon'},{grades:{$slice:-3},name:1});//Output{"_id":ObjectId("59057c16f551d8c9003d31e0"),"name":"jhon","grades":[22,44,88]}下面说明指定数组为一个参数。数组参数使用[skip,limit]格式,其中第一个值表示数组中跳过的项目数,第二个值表示返回的项目数。db.user.find({name:'jack'},{grades:{$slice:[2,2]},name:1});//这样会跳过前两个,直接得到后两个数据//output{"_id":ObjectId("59057c16f551d8c9003d31df"),"name":"jack","grades":[44,55]}$exists如果$exists的值为真,选择字段存在如果值为false,请选择不包含此字段的文档。下面查询sex中不存在的信息。db.user.find({sex:{$exists:false}})//结果{"_id":ObjectId("59058460fe58ed1089f2a5cd"),"name":"xiaoming","age":33,"tags":["python","java"],"grades":[66,22,44,88],"school":{"name":"kuangda","city":"徐州"}}db.user.find({sex:{$exists:true}});//结果{"_id":ObjectId("59058460fe58ed1089f2a5cb"),"name":"jack","age":22,"sex":"Man","标签":["python","c++","c"],"成绩":[22,33,44,55],"学校":{"名称":"shida","city":"徐州"}}{"_id":ObjectId("59058460fe58ed1089f2a5cc"),"name":"jhon","age":33,"sex":null,"tags":["python","java"],"grades":[66,22,44,88],"school":{"name":"kuangda","city":"徐州"}}$或执行逻辑或操作,指定一个至少包含两个表达式的数组,选择数组中至少满足一个表达式的文档Syntax:{$or:[{},{},...,{}]}以下将找到age等于22或age等于33db.user的值。find({$or:[{age:22},{age:33}]})//结果{"_id":ObjectId("59058460fe58ed1089f2a5cb"),"name":"jack","age":22,"sex":"Man","tags":["python","c++","c"],"grades":[22,33,44,55],"school":{"name":"shida","city":"徐州"}}{"_id":ObjectId("59058460fe58ed1089f2a5cc"),"name":"jhon","age":33,"sex":null,"tags":["python","java"],"grades":[66,22,44,88],"school":{"name":"kuangda","city":"徐州"}}{"_id":ObjectId("59058460fe58ed1089f2a5cd"),"name":"xiaoming","age":33,"tags":["python","java"],"grades":[66,22,44,88],"school":{"name":"kuangda","city":"徐州"}}下面将查找年龄为22或33且姓名为jack的人的信息db.user.find({name:'jack',$or:[{age:33},{age:22}]})//result{"_id":ObjectId("59058460fe58ed1089f2a5cb"),"name":"jack","age":22,"sex":"Man","tags":["python","c++""c"],"grades":[22,33,44,55],"school":{"name":"shida","city":"xuzhou"}}$并指定包含at的表达式至少两个数组,选择满足数组中所有表达式的文档。$and运算符使用短路操作。如果第一个表达式的值为“false”,则不会执行其余表达式。语法:{$and:[{},{},...,{}]}下面将搜索年龄在20-30之间的信息,使用逗号分隔下面的表达式列表,MongoDB会提供一个隐式的$and操作:db.user.find({$and:[{age:{$gt:20}},{age:{$lt:30}}]})//以上语句相当于db.user.find({age:{$gt:20},age:{$lt:30}})//Result{"_id":ObjectId("59058460fe58ed1089f2a5cb"),"名称“:”杰克“,”年龄“:22,”性别“:”男人“,”标签“:[”python“,”c++“,”c“],”成绩“:[22,33,44,55],"school":{"name":"shida","city":"xuzhou"}}$in匹配key值为指定数组中任意值的文档。类似于sql中的in,只要匹配到一个值,就会输出语法:{field:{$in:[,,...]}}下面会搜索存在于22和33之间的任意数量的信息db.user.find({grades:{$in:[22,33]}})//output{"_id":ObjectId("59058460fe58ed1089f2a5cb"),"name":"jack","age":22,"sex":"Man","tags":["python","c++","c"],"grades":[22,33,44,55],"school":{"name":"shida","city":"徐州"}}{"_id":ObjectId("59058460fe58ed1089f2a5cc"),"name":"jhon","age":33,"sex":null"tags":["python","java"],"grades":[66,22,44,88],"school":{"name":"kuangda","city":"徐州"}}{"_id":ObjectId("59058460fe58ed1089f2a5cd"),"name":"xiaoming","age":33,"tags":["python","java"],"grades":[66,22,44,88],"school":{"name":"kuangda","city":"徐州"}}$nin匹配键不存在或者键值不等于指定数组任意值的文档,类似于sql中的notin(如果sql中的字段不存在,会出现语法错误).查询100或44级不存在的文档db.user.find({grades:{$nin:[100,44]}})$not执行逻辑NOT操作,选择不匹配表达式的文档,包括没有指定密钥的文档。$not运算符不能单独使用,必须和其他操作一起使用语法:{field:{$not:{}}}查询年龄不大于30的信息db.user.find({age:{$not:{$gt:30}}})//输出{"_id":ObjectId("59058460fe58ed1089f2a5cb"),"name":"jack","age":22,"sex":"Man","tags":["python","c++","c"],"grades":[22,33,44,55],"school":{"name":"shida","city":"徐州"}}