查找复合条件的全部文档html
db.collection.find(query,field)
query 查找条件 格式: {ssss:"xxx"}是一个键值对构成的文档 若是是空, 表示查找全部内容 field 查找的域 格式: {ssss:"xxx"}是一个键值对构成的文档 设置值: 设置为1 表示查找该域,其余自动为 0 设置为0 表示不查找该域,其余自动为 1 设置的时候要不所有为 1 或者所有 为 0 是不能混搭的 _id 域若是没写使用被选中,不会受其余影响 _id:0 才能够不显示 若是是空, 表示查找全部域
返回查找到的全部文档mongodb
query 参数不传递, 是没法传递 field 参数的数组
若是无 query 参数,且使用 field 参数则须要 query 设置成 {} 便可ide
查询全部含有 age:18 键值对的文档 输入: > db.class0.find({age:18}) 输出: { "_id" : ObjectId("5c76550eb9330b7c15210101"), "name" : "tuo", "age" : 18, "sex" : "man" } { "_id" : ObjectId("5c765554b9330b7c15210102"), "name" : "jlsajdla", "age" : 18, "sex" : "man" }
查找全部文档,仅显示 name,age 字段 输入: > db.class0.find({},{_id:0,name:1,age:1}) 输出: { "name" : "yang", "age" : 16 } { "name" : "tuo", "age" : 18 } { "age" : 18 } { "age" : 18 }
查找第一条符合条件的文档函数
db.collection.findOne(query,field)
用法同 find学习
同 findspa
> db.class0.find() { "_id" : ObjectId("5c765408b9330b7c15210100"), "name" : "yang", "age" : 16 } { "_id" : ObjectId("5c76550eb9330b7c15210101"), "name" : "tuo", "age" : 18, "sex" : "man" } { "_id" : ObjectId("5c765554b9330b7c15210102"), "Null" : "tuo", "age" : 18, "sex" : "man" } { "_id" : ObjectId("5c765568b9330b7c15210103"), "null" : "tuo", "age" : 18, "sex" : "man" } { "_id" : 1, "name" : "tuo", "age" : 18, "sex" : "man" } { "_id" : 2, "name" : "tuo", "age" : 18, "sex" : "man" } { "_id" : 3, "name" : "4tuo", "age" : 418, "sex" : "man" } { "_id" : 4, "name" : "hjsdj", "age" : 18 } { "_id" : ObjectId("5c765918b9330b7c15210104"), "name" : "4tuo", "age" : 418, "sex" : "man" } { "_id" : ObjectId("5c765918b9330b7c15210105"), "name" : "hjsdj", "age" : 18 } { "_id" : ObjectId("5c76592db9330b7c15210106"), "name" : "jj", "age" : 18 } { "_id" : ObjectId("5c765a8ab9330b7c15210107"), "name" : "ub", "age" : 88, "sex" : "man" } > db.class0.find({name:"tuo"},{_id:0,sex:1}) { "sex" : "man" } { "sex" : "man" } { "sex" : "man" } > db.class0.find({name:"tuo"},{_id:0,sex:1,age:1}) { "age" : 18, "sex" : "man" } { "age" : 18, "sex" : "man" } { "age" : 18, "sex" : "man" } > db.class0.find({name:"tuo"},{_id:0,sex:1,age:0}) Error: error: { "ok" : 0, "errmsg" : "Projection cannot have a mix of inclusion and exclusion.", "code" : 2, "codeName" : "BadValue" } > > db.class0.find({},{_id:0,sex:1,age:1}) { "age" : 16 } { "age" : 18, "sex" : "man" } { "age" : 18, "sex" : "man" } { "age" : 18, "sex" : "man" } { "age" : 18, "sex" : "man" } { "age" : 18, "sex" : "man" } { "age" : 418, "sex" : "man" } { "age" : 18 } { "age" : 418, "sex" : "man" } { "age" : 18 } { "age" : 18 } { "age" : 88, "sex" : "man" } > > db.class0.findOne({},{_id:0,sex:1,age:1}) { "age" : 16 } >
MongoDB 中使用 $ 符号注明的有特殊意义的字符串,用于表达丰富的含义操作系统
{name{$eq:17}} 形同 {name:17}code
query 位置htm
$eq 等于
$lt 小于
$lte 小于等于
$gt 大于
$gte 大于等于
$ne 不等于
query : {field:{$操做符:值}}
ps:
{age:{$gt:17,$lt:20}} 能够多个条件并列, 以 and 的关系.
age < 18 > db.class0.find({age:{$lt:18}})
age > 18 > db.class0.find({age:{$gt:18}})
age = 18 > db.class0.find({age:{$eq:18}})
name > y > db.class0.find({name:{$gt:"y"}})
15 < age < 20 > db.class0.find({age:{$gt:15,$lt:20}})
age >= 18 > db.class0.find({age:{$gte:18}})
age <= 18 > db.class0.find({age:{$lte:18}})
age != / <> 18 > db.class0.find({age:{$ne:18}})
存在范围内
格式 :
query: {field:{$in:[xx,xx,xx,xx]}}
> db.class0.find({age:{$in:[1,16,18]}})
不存在范围内
格式 :
query: {field:{$nin:[xx,xx,xx,xx]}}
> db.class0.find({age:{$nin:[1,16,18]}})
{$and[{},{}]} 彻底等同于 {{},{}}
默认的 " , " 相连就是 $and 的关系
获取 年级大于18 且 性别为男的文档 > db.class0.find({$and:[{age:{$gt:18}},{sex:"man"}]},{_id:0})
获取 年级大于18 且 性别为男的文档 > db.class0.find({age:{$gt:18}},{sex:"man"},{_id:0})
{$or[{},{}]}
获取 年纪小于18 或者 性别为男的文档 > db.class0.find({$or:[{age:{$lt:18}},{sex:"man"}]},{_id:0})
{$not:{...}} 单目运算
获取 性别 不是 男性 的文档 > db.class0.find({sex:{$not:{$eq:"man"}}})
这里必需要用 $eq 来做为链接赋值判断, $not 后面不能直接跟值来判断.
> db.class.find({sex:{$not:"b"}},{_id:0}) Error: error: { "ok" : 0, "errmsg" : "$not needs a regex or a document", "code" : 2, "codeName" : "BadValue" }
not (A or B)
A,B 全都是假才能够是真
{$nor:[{},{}]}
获取既不是 男性 又不大于18岁 的文档 > db.class0.find({$nor:[{age:{$lt:18}},{sex:"man"}]},{_id:0})
年龄大于18 或者小于17 而且 性别为男 > db.class0.find({$or:[{age:{$gt:18}},{age:{$lt:17}}],sex:"man"},{_id:0})
年龄大于17 的男生 或者 姓名叫作 yang 或者 tuo > db.class0.find({$or:[{name:"yang"},{name:"tuo"}],sex:"man",age:{$gt:17}},{_id:0})
数组: 一组数据的有序集合,用[]表示
查询的时候会把只要知足任意条件的都拿出来
含有 18 就算 > db.class.find({score:18},{_id:0}) { "name" : "yy", "age" : 8, "score" : [ 56, 18, 75 ] }
有一个超过 60 就算 > db.class.find({score:{$gt:60}},{_id:0}) { "name" : "yang", "age" : 6, "score" : [ 98, 56, 32 ] } { "name" : "tuo", "age" : 9, "score" : [ 82, 56, 81 ] } { "name" : "yy", "age" : 8, "score" : [ 56, 18, 75 ] }
必须包含 82 和 81 > db.class.find({score:{$all:[82,81]}},{_id:0}) { "name" : "tuo", "age" : 9, "score" : [ 82, 56, 81 ] }
取出数组长度为 2 的文档 > db.class.find({score:{$size:2}},{_id:0}) { "name" : "zz", "age" : 8, "score" : [ 55, 78 ] }
用于 filed 参数
单数值表示显示数组的前几项
列表传入两个值 表示显示数组的起点,以及起点后几项
既然是切片那天然就 左不包含,右包含
取出数组前两项 > db.class.find({},{_id:0,score:{$slice:2}})
从数组第一项日后取两项,不包括第一项 > db.class.find({},{_id:0,score:{$slice:[1,2]}})
从数组的第三项日后取两项,不包括第三项 > db.class.find({},{_id:0,score:{$slice:[3,2]}}) { "name" : "yang", "age" : 6, "score" : [ ] }
取出不含有 score 域的文档 > db.class.find({score:{$exists:false}},{_id:0}) { "name" : "pp", "age" : 18 } 取出含有 score 域的文档 > db.class.find({score:{$exists:true}},{_id:0})
找 age 为偶数 的文档 > db.class.find({age:{$mod:[2,0]}},{_id:0})
找age 为奇数 的文档 > db.class.find({age:{$mod:[2,1]}},{_id:0})
{$type:int} 数字为类型标号, 具体类型编号参考 这里
查找的数值为 类型的标识数字 > db.class.find({name:{$type:2}},{_id:1})
注意点:
虽然 score 里面是个数组,可是find 查询的时候取出来的不是数组总体而是里面的值
所以除非 score:[[1,2,3],4,5] 这样值里面还有数组才能够被命中.
仅仅是 score:[1,2,3,4,5] 这样取出来的其实只是 1,2,3,4,5 这样的数字
按理说查找 16 的 32bit-int 数字, 可是依旧查不到
其实本质上由于操做系统的转换自动帮你转换成了 浮点型,所以使用 1 才能够查到
> db.class.find({score:{$type:4}},{_id:1}) > > db.class.find({score:{$type:16}},{_id:1}) > > db.class.find({score:{$type:1}},{_id:1}) { "_id" : ObjectId("5c775857c69c81d07212f58a") } { "_id" : ObjectId("5c775887c69c81d07212f58b") } { "_id" : ObjectId("5c7758e8c69c81d07212f58c") } { "_id" : ObjectId("5c775b82bed69fac33334adf") } >
额外
其余操做符不会的能够在官网查看说明进行学习使用 官方文档
在被查询出来的文档集合后再一次的过滤查询获得更精确的结果
db.collection.distinct(field)
获取某个集合中某个域的值范
域名
获取范围数组(去重的)
查看 age 域 有哪些值 > db.class.distinct("age") [ 6, 9, 8, 18 ]
将find查找结果格式化显示,每一个域单行显示,没什么实际意义....
无参数
> db.class.find().pretty() { "_id" : ObjectId("5c775857c69c81d07212f58a"), "name" : "yang", "age" : 6, "score" : [ 98, 56, 32 ] } ...
显示查询结果的前几项
n 指定显示数量
查看全部数据的前三条 > db.class.find({},{_id:0}).limit(3) { "name" : "yang", "age" : 6, "score" : [ 98, 56, 32 ] } { "name" : "tuo", "age" : 9, "score" : [ 82, 56, 81 ] } { "name" : "yy", "age" : 8, "score" : [ 56, 18, 75 ] } >
跳过查询结果的前几个,显示后面的
n 跳过个数
> db.class.find({},{_id:0}) { "name" : "yang", "age" : 6, "score" : [ 98, 56, 32 ] } { "name" : "tuo", "age" : 9, "score" : [ 82, 56, 81 ] } { "name" : "yy", "age" : 8, "score" : [ 56, 18, 75 ] } { "name" : "zz", "age" : 8, "score" : [ 55, 78 ] } { "name" : "pp", "age" : 18 }
查询全部文档, 跳过前三个 > db.class.find({},{_id:0}).skip(3) { "name" : "zz", "age" : 8, "score" : [ 55, 78 ] } { "name" : "pp", "age" : 18 }
统计查询结果
> db.class.find({},{_id:0}).count() 5
ps:
给出查找条件的时候就是准的,有时候不给条件的时候就有时候会不精准
排序
field 排序的域 ,
可选值:
1 升序
2 降序
> db.class.find({},{_id:0}).sort({age:1}) { "name" : "yang", "age" : 6, "score" : [ 98, 56, 32 ] } { "name" : "yy", "age" : 8, "score" : [ 56, 18, 75 ] } { "name" : "zz", "age" : 8, "score" : [ 55, 78 ] } { "name" : "tuo", "age" : 9, "score" : [ 82, 56, 81 ] } { "name" : "pp", "age" : 18 } > db.class.find({},{_id:0}).sort({age:-1}) { "name" : "pp", "age" : 18 } { "name" : "tuo", "age" : 9, "score" : [ 82, 56, 81 ] } { "name" : "yy", "age" : 8, "score" : [ 56, 18, 75 ] } { "name" : "zz", "age" : 8, "score" : [ 55, 78 ] } { "name" : "yang", "age" : 6, "score" : [ 98, 56, 32 ] } >
也能够复合排序, 先按照 age 排序, 若是相同, 按照 name 排序 > db.class.find({},{_id:0}).sort({age:-1},{name:-1})
只要你返回的是文档集合(count 就不行), 理论上你就能够无限调用下去
> db.class.find({},{_id:0}).limit(5).skip(3).sort({age:1}).pretty() { "name" : "tuo", "age" : 9, "score" : [ 82, 56, 81 ] } { "name" : "pp", "age" : 18 }
索引序号的方式直接获取某一项文档
> db.class.find({},{_id:0}).limit(5).skip(3).sort({age:1}).pretty() { "name" : "tuo", "age" : 9, "score" : [ 82, 56, 81 ] } { "name" : "pp", "age" : 18 } > db.class.find({},{_id:0}).limit(5).skip(3).sort({age:1}).pretty()[1] { "name" : "pp", "age" : 18 } >