读取文档
db.<collection>.find()
- 匹配查询
- 查询操作符
- 游标
- 查询操作返回的结果游标
- 游标的迭代与操作
- 投射
- 只返回部分字段
- 内嵌文档的投射
- 数组的投射
匹配查询
db.<collection>.find(<query>,<projection>)
-
<query>
定义了读取操作时筛选文档的条件 -
<projection>
定义了对读取结果进行的投射操作> db.accounts.find({name:"alice"}) { "_id" : "account1", "name" : "alice", "balance" : 100 } 复合主键的匹配查询 >db.accounts.find({"_id.type":"saving"})
-
查询操作符
-
比较操作符
-
{<field>:{$<operator>:<value>}}
-
$<operator>
:$eq
,$ne
,$gt
,$gte
,$lt
,$lte
,$in
,$nin
>db.accounts.find({"name":{$ne:"alice"}}) 需要注意的是,$ne也会筛选出并不包含查询字段的文档,即这个文档没有<field>字段,该文档也会被筛选出来
-
$in
匹配字段值与任一查询值相等的文档 -
$nin
匹配字段值与任何查询值都不等的文档>db.accounts.find({"name":{$nin:["alice","ben","bob"]}}) 需要注意的是,和$ne一样,$nin也会筛选出并不包含查询字段的文档
-
-
逻辑操作符
$not
筛选条件不成立的文档{field:{$not:{<operator-expression>}}
,$not
也和$ne
一样同样会筛选出不包含查询字段的文档
$and
匹配多个筛选条件全部成立的文档{$and:[{<expression1>},{<expression2>},...]}
$or
匹配至少一个筛选条件成立的文档$nor
匹配筛选条件全都不成立的文档,需要注意的是,和$ne
一样,$nor
也会筛选出并不包含查询字段的文档
-
字段操作符
$exists
匹配包含查询字段的文档{field:{$exists:<boolean>}}
$type
匹配字段类型复合查询值的文档{field:{$type:<BSON type>}}
{field:{$type:[<BSON type1>,<BSON type2>,...]}}
-
数组操作符
$all
匹配数组字段中包含所有查询值的文档{field:{$all:[<value1>,<value2>,...]}}
$elemMatch
匹配数组字段中至少存在一个值满足筛选条件的文档{field:{$elemMatch:{<query1>,<query2>,...}}}
-
运算操作符
$regex
匹配满足正则表达式的文档-
{field:{:/pattern/,:'<options>'}}
-
{field:{:/pattern/<options>}}
,在和$in
操作符一起使用时,只能使用该语法读取用户姓名以c或者j开头的银行账户文档 ---- 第二种语法 >db.accounts.find({name:{$in:[/^c/,/^j/]}}) 读取用户姓名包含LIE(不区分大小写)的银行账户文档 ---- 第一种文档 >db.accounts.find({name:{$regex:/LIE/,$options:"i"}})
-
文档游标
-
db.collection.find()
返回一个文档集合游标,在不迭代游标的情况下,只列出前20个文档注意末尾的分号 >var myCursor = db.accounts.find(); myCursor 遍历完游标中所有的文档之后,或者在10分钟之后,游标便会自动关闭,可以使用noCursorTimeout()函数来保持游标一直有效 >var myCursor = db.accounts.find().noCursorTimeout(); 在这之后,在不遍历游标的情况下,需要主动关闭游标;游标遍历完也会关闭 >myCursor.close()
-
游标函数
-
cursor.hasNext()
-
cursor.next()
>var myCursor = db.accounts.find({name:"george"}); while( myCursor.hasNext()) { printjson(myCursor.Next()); }
-
cursor.forEach()
>var myCursor = db.accounts.find({name:"george"}); myCursor.forEach(printjson)
-
cursor.limit()
-
cursor.skip()
-
cursor.count()
cursor.count(<applySkipLimit>)
,默认情况下参数为false,即忽略limit和skip的效果
-
cursor.sort()
,注意这里sort的优先级高于skip高于limitcursor.sort(<document>)
,这里的<document>
定义了排序的要求,{field:ordering}
,1表示正向排序,-1表示逆向排序
-
文档投影
db.collection.find(<query>,<projection>)
,不使用投影时,db.collection.find()
返回符合筛选条件的完整文档,而使用投影可以有选择性的返回文档中的部分字段{filed:inclusion}
,1表示返回字段,0表示不返回字段,默认会返回文档主键_id
,可以使用_id:0
不返回文档主键- 除文档主键之外,我们不可以在投影文档中混用包含和不包含操作,即要么列出所有想要包含的字段,要么列出所有不想包含的字段
- 在数组字段上使用投影
-
$slice
操作符可以返回数组字段中的部分元素- 当
$slice
的参数为n时,表示投射数组中前n个元素 - 当
$slice
的参数为-n时,表示投射数组中倒数n个元素 - 当
$slice
的参数为[n,m]时,表示数组进行skip(1)和limit(m)操作
- 当
-
$elemMatch
和$
操作符可以返回数组字段中满足筛选条件的第一个元素,当对文档的筛选条件和在投射操作中对数组的筛选条件一致的时候,可以使用$
操作符使用$elemMatch操作符 >db.accounts.find({},{_id:0,name:1,contact:{$elemMatch:{$gt:"Alabama"}}}) 使用$操作符,这里不建议使用$操作符 >db.accounts.find({contact:{$gt:"Alabama"}},{_id:0,name:1,"contact.$":1})
-