理解Cursor对象和查询运算符
cursor对象
cursor对象相当于一个指针,可通过迭代它来访问MongdoDB数据库中的一组对象。
在使用 find() 方法查询时,返回的并非实际文档,而是一个Cursor对象,也就是一个指向第一个数据之前的指针。
Cursor对象内部存储了一个指向当前位置的索引,可以保证每次读取一个文档。在MongoDB中,有些操作只影响Cursor中的当前文档,并将索引数加 1,而有些操作影响当前索引之后的所有文档。
查询运算符
在进行查找时,可以使用一些查询运算符来进行查询匹配。以来判断文档中字段的值是否符合指定的条件。类似与 sql 语句中 where 查询后面的条件。
运算符 | 描述 | 示例 |
field:value | 与字段值为value的文档匹配 | { name : "myName" } |
$gt | 与字段值大于指定值的文档匹配 | { size : { $gt : 5 } } |
$gte | 与字段值大于等于指定值的文档匹配 | { size : { $gte : 5 } } |
$in | 与字段值包含在指定数组中的文档匹配 | { like : { $in : [ "C","JAVA" ] } } |
$lt | 与字段值小于指定值的文档匹配 | { size : { $lt : 5} } |
$lte | 与字段值小于等于指定值的文档匹配 | { size : { $lte : 5 } } |
$ne | 与字段值不等于指定值的文档匹配 | { name : {$ne : "badName"} } |
$nin | 与字段值不包含在指定数组中的文档匹配 | { name : { $nin : ["html","css"] } } |
$or | 使用逻辑或连接查询字句,并返回符合任何一个字句条件的文档 | { $or : [ {size : {$lt : 5} }, {size : {$gt : 10} } ] } |
$and | 使用逻辑与连接查询字句,并返回与两个字句条件都匹配的文档 | { $and : [ { size : { $gt : 5 } },{ size : { $lt : 10 } } ] } |
$not | 反转查询表达式的效果,返回与查询表达式不匹配的文档 | { $not : { name : "myName" } } |
$nor | 使用逻辑或非连接查询字句,返回与两个字句都不匹配的文档 | { $nor : { size : { $gt : 5 } },{ size : { $lt : 0 } } } |
$exists | 值为 true 时匹配包含指定字段的文档,为 false 时返回不包含该字段的文档 | { name : { $exists : true } } |
$regex | 返回指定字段的值与指定正则表达式匹配的文档 | { myString : { $regex : ' some.*exp ' } } |
$all | 返回指定数组包含所有指定的元素的文档 | { word : { $all : [ 'a','b','c' ] } } |
$elemMatch | 返回指定的数组字段至少有一个元素与指定的条件都匹配的文档 | { myArr : { $elemMatch : { { value : { $gt : 5 } },{ size : { $lt : 10 } } } } } |
$size | 指定数组的长度 | { myArr : { $size : 5 } } |
查询文档
find() 方法
查询集合中的文档可以用 find() 方法进行查询,其语法为
find( query, projection)
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
find() 方法返回一个 find()Cursor对象,表示与查询条件匹配的文档。
function (query, fields, limit, skip, batchSize, options) { var cursor = new DBQuery(this._mongo, this._db, this, this._fullName, this._massageObject(query), fields, limit, skip, batchSize, options || this.getQueryOptions()); { const session = this.getDB().getSession(); const readPreference = session._serverSession.client.getReadPreference(session); if (readPreference !== null) { cursor.readPref(readPreference.mode, readPreference.tags); } const readConcern = session._serverSession.client.getReadConcern(session); if (readConcern !== null) { cursor.readConcern(readConcern.level); } } return cursor; }
示例:
findOne()方法
它的用法与 find() 相同,只是 findOne() 只返回与查询条件匹配的第一个文档。
示例:
根据多个字段查询文档
根据多个字段进行查询时,可以将多个查询字段放在一个文档中查询,或者使用 $and 连接符进行连接。
注意:根据多个字段查询文档时,若将多个字段放在多个文档中查询时,只能根据第一个文档查询出数据。第二个文档会作为另一个可选参数(投影)。
根据子文档查询
根据子文档的字段值进行查询时,可用 find( { " 子文档.子文档字段 " :value } ) 方法进行查询。
示例:
1 { 2 "_id" : ObjectId("5ca86917e8717d2b3f6e21e3"), 3 "name" : "张三", 4 "age" : 18, 5 "father" : { 6 "name" : "uzi", 7 "age" : 24 8 } 9 } 10 { 11 "_id" : ObjectId("5ca86917e8717d2b3f6e21e4"), 12 "name" : "李四", 13 "age" : 19, 14 "father" : { 15 "name" : "letme", 16 "age" : 25 17 } 18 } 19 { 20 "_id" : ObjectId("5ca86917e8717d2b3f6e21e5"), 21 "name" : "王五", 22 "age" : 20, 23 "