find 操作语法展示:

find()操作实例 :

//连接数据库
dbService = connect("localhost:27017");
//选择插入集合
db = dbService.getSiblingDB("jike"); //创建bulk对象用于批量插入
db.query_test.drop();
var bulk = db.query_test.initializeUnorderedBulkOp(); //测试数据
var doc1 = {
name:"joe",
age:20
}
bulk.insert(doc1); var doc2 = {
name:"joe",
age:31
}
bulk.insert(doc2); var doc3 = {
name:"jack",
age:21
}
bulk.insert(doc3); var doc4 = {
name:"John",
age:null
}
bulk.insert(doc4); //执行插入操作
bulk.execute() print("========find - 基本使用=======")
/*
db.集合名.find( query , fields , limit , skip)
*/
var cursor = db.query_test.find(
{}, //查询条件
{ _id:0,age:1}, //字段映射
2, //返回结果条数
1).sort({age:1}); //跳过文档条数 结果按照年龄升序排列
printjson(cursor.toArray()) var cursor = db.query_test.find(
{}, //查询条件
{ _id:0,age:1} //字段映射
).limit(2).skip(1).sort({age:1})
printjson(cursor.toArray()) print("========find - $eq 比较操作符的使用=======")
/*
$eq 等值查询 匹配键值等于参数指定值的文档
{ <field>: { $eq: <value> } }
*/
var cursor = db.query_test.find(
{
age: { $eq:20 } //也可以写成 age:20
//age:20
}
);
printjson(cursor.toArray()) print("========find - $in 比较操作符的使用=======")
/*
$in 查询键值包含于参数数组中的文档,类似SQL中in
{ field: { $in: [<value1>, <value2>, ... <valueN> ] } }
*/
var cursor = db.query_test.find(
{
age: { $in:[20,21] } //age==20或age==21
}
);
printjson(cursor.toArray()) print("========find - $nin 比较操作符的使用=======")
/*
$nin 查询键值不存在或者键值不包含于参数数组中的文档
{ field: { $nin: [ <value1>, <value2> ... <valueN> ]} }
*/
var cursor = db.query_test.find(
{
age: { $nin:[20,21] } //age>21 && age<=31
}
);
printjson(cursor.toArray()) print("========find - $and 逻辑操作符的使用=======")
/*
$and && 且逻辑操作符 选择满足所有表达式的文档
{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
注意:1. and 操作符使用的是”短路运算“,即如果第一个表达式返回 false的话,不会再计算后面的表达式
2. and 操作符有隐式和显式两种 隐式的可以使用 逗号 连接多个表达式
3. 一般情况下隐式和显式两种方式是等价的,但有的时候只能显式使用$and
*/
var cursor = db.query_test.find(
{
//$and: [ { age:{$gt:21}}, { age:{ $lte:31} } ] //age>21 && age<=31
//age:{$gte:20,$lte:31}
$and: [
{ $or:[ { age:19 },{ age:21 } ] }, //age=19或age=21
{ $or:[ { name:"joe" },{ name:"jack" } ] }
]
}
);
printjson(cursor.toArray()) print("========find - $nor 逻辑操作符的使用=======")
/*
$nor 用于查询集合中不满足参数数组中列出的所有条件的文档
{ $nor: [ { <expression1> }, { <expression2> }, ... { <expressionN> } ] }
*/
var cursor = db.query_test.find(
{
$nor:[
{ name:"joe" },
{ name:"jack" }
]
});
printjson(cursor.toArray()) print("========find - $not/$gt/$lte 操作符的使用=======")
/*
$not 对表达式取反
{ field: { $not: { <operator-expression> } } } $gt > 大于操作符 查询键值大于指定值的文档
{field: {$gt: value} } $lte <= 小于等于操作符 查询键值不大于指定值的文档
{ field: { $lte: value} }
*/
var cursor = db.query_test.find(
{
age:{ $not: { $gt:22,$lte:30 } } //age<=22 或 age>30
});
printjson(cursor.toArray()) print("========find - $exists 元素操作符的使用=======")
/*
$exists 查询存在(或不存在)指定字段的文档
{ field: { $exists: <boolean> } }
*/
var cursor = db.query_test.find(
{
age: { $exists:true }
}
);
printjson(cursor.toArray())

find() 数组查询:

数组查询相关的操作符号:

  其中 $elemMatch 元素能当 查询条见  还能当 元素映射

数组元素是普通元素

//连接数据库
dbService = connect("localhost:27017");
//选择插入集合
db = dbService.getSiblingDB("jike"); //创建bulk对象用于批量插入
db.query_array.drop();
var bulk = db.query_array.initializeUnorderedBulkOp(); //测试数据
var doc1=
{ _id: 5,
name: "xiaoli",
age: 20,
scores: [ 95, 98, 99 ]
}
bulk.insert(doc1); var doc2=
{ _id: 6,
name: "xiaoqiang",
age: 22,
scores: [ 95, 99 ]
} bulk.insert(doc2); var doc3=
{
_id: 7,
name: "xiaoming",
item: 22,
scores: [ 99, 95, 98 ]
}
bulk.insert(doc3); //执行插入操作
bulk.execute() //测试查询
print("========find--整个数组查询 ========")
var cursor = db.query_array.find(
{
scores: [ 95, 98, 99 ]
});
printjson( cursor.toArray() ); print("========find--数组查询(某一个数据元素)=======")
var cursor = db.query_array.find(
{
scores: 95
});
printjson( cursor.toArray() ); var cursor = db.query_array.find(
{
"scores.0": 95
});
printjson( cursor.toArray() ); print("========find--$all操作符的使用=======")
/*
用于查询数组中包含 $all数组参数指定的所有元素 的文档
{ <field>: { $all: [ <value1> , <value2> ... ] } }
注意:查询文档中数组元素的顺序可以和$all参数指定的数组元素的顺序不同
*/
var cursor = db.query_array.find(
{
scores:
{
$all:[99,98]
}
});
printjson( cursor.toArray() ); print("========find--$elemMatch操作符的使用(多条件查询条件)=======")
/*
用于多条件查询 查询集合中文档的数组字段,至少有一个元素同时满足$eleMatch参数列出的所有条件 的文档
{ <field>: { $elemMatch: { <query1>, <query2>, ... } } }
注意:如果不使用$eleMatch操作符,将返回 文档的数组字段任意元素的组合,满足所有条件的文档
*/
var cursor = db.query_array.find(
{
scores:
{
$elemMatch: { $gt: 95, $lt: 99 }
}
});
printjson( cursor.toArray() ); var cursor = db.query_array.find(
{
scores:
{
$gt: 95, $lt: 99
}
} );
printjson( cursor.toArray() ); print("========find--$elemMatch操作符的使用(字段映射)=======")
var cursor = db.query_array.find(
{}, //查询条件
{
scores://字段映射
{
$elemMatch:{ $gt:95, $lt:99 }
}
});
printjson( cursor.toArray() ); print("========find--$size操作符的使用=======")
/*
查询指定长度的数组
{ field: { $size: <number>} }
参数只能是一个确切的整数,不能和其它查询操作符一起使用
*/
var cursor = db.query_array.find(
{
scores:
{
$size: 2
}
});
printjson( cursor.toArray() ); print("========find--$slice操作符的使用=======")
/*
对数组元素做映射
{ array: {$slice: count } }
{ array: {$slice: [skip,limit] } }
*/
var cursor = db.query_array.find(
{}, //查询条件
{
scores://字段映射
{
$slice: [1,2]
}
});
printjson( cursor.toArray() ); print("========find--$操作符的使用=======")
/*
对数组元素做映射,只返回匹配的第一个元素
db.collection.find( { <array>: <value> ... },
{ "<array>.$": 1 } )
db.collection.find( { <array.field>: <value> ...},
{ "<array>.$": 1 } )
需要说明的是,被限制的数组元素必须要出现在find函数第一个参数中,用于指明要查询的数组元素的条件
*/
var cursor = db.query_array.find(
{ scores: {$gt:94} }, //查询条件
{
"scores.$":1 //返回满足查询条件的第一个数组元素
});
printjson( cursor.toArray() );

数组元素是 文档的时候:

//连接数据库
dbService = connect("localhost:27017");
//选择插入集合
db = dbService.getSiblingDB("jike"); //创建bulk对象用于批量插入
db.array_embedded.drop();
var bulk = db.array_embedded.initializeUnorderedBulkOp(); //测试数据
var doc1=
{ _id: 1,
name: "xiaoli",
age: 20,
scores: [
{ 课程:"语文",成绩:90},
{ 课程:"数学",成绩:95}
]
}
bulk.insert(doc1); var doc2=
{ _id: 2,
name: "xiaoqiang",
age: 22,
scores: [
{ 课程:"语文",成绩:92},
{ 课程:"英语",成绩:90}
]
} bulk.insert(doc2); //下面执行插入操作
bulk.execute() //测试查询
print("========find--数组查询(不使用数组索引) ========")
var cursor = db.array_embedded.find({ 'scores.成绩':90 } );
printjson( cursor.toArray() ); print("========find--数组查询 (使用数组索引)========")
var cursor = db.array_embedded.find( { 'scores.1.成绩': 90} );
printjson( cursor.toArray() ); print("========find--$elemMatch操作符(多条件查询条件)的使用========")
var cursor = db.array_embedded.find( {
scores:
{
$elemMatch: {"课程":"语文","成绩":90}
}
}
);
printjson( cursor.toArray() );

$where 查询: 功能强大且灵活 可以把js表达式字符串或者函数作为查询语句的一部分,可以用this 或者 obj 来引用当前操作的文档

应当尽量避免使用,文档bson转为 js 对象才能运行,比常规的 要慢

//连接数据库
dbService = connect("localhost:27017");
//选择插入集合
db = dbService.getSiblingDB("jike"); //创建bulk对象用于批量插入
db.query_where.drop();
var bulk = db.query_where.initializeUnorderedBulkOp(); //测试数据
var doc1 = { "apple":1, "banana": 6, "peach" : 4}
bulk.insert(doc1); var doc2 = {"apple":3, "banana": 3, "peach" : 4}
bulk.insert(doc2); //执行插入操作
bulk.execute() print("========find--$where操作符的使用========")
/*
参数可以是JavaScript函数或JavaScript表达式的字符串
{ $where: function() { } }
{ $where: "this.A == this.B"} 或 { $where: "obj.A == obj.B"}
*/
var cursor = db.query_where.find(
{
$where:function()
{
for (var current in this)
{ for (var other in this)
{
if (current != other && this[current] == this[other]) //查找文档中水果种类的数量是不是有一致的
return true;
}
}
}
});
printjson( cursor.toArray() ); var cursor = db.query_where.find(
{
$where:"this.apple==1 && this.banana==6"
});
printjson( cursor.toArray() ); 结果:
[
    {
        "_id" : ObjectId("56c998011588ee87d0427795"),
        "apple" : 3,
        "banana" : 3,
        "peach" : 4
    }
]

下面是很早之前学习使用的笔记

一 创建数据库

执行操作进入mongodb   使用参数模式   也可以使用 db.auth()来验证。

root@timeless-HP-Pavilion-g4-Notebook-PC:/usr/local/apache243/htdocs# /usr/local/mongodb/mongo  -uroot -pxxxxx localhost:27017/admin

下面是第一次创建新的数据库

> use DEMO
switched to db DEMO
> db.user.insert({name:"zhaoxingzhuang",age:18,sex:"man",location:{province:"shandong",city:"jinan",road:"shandaroad-47"}})
WriteResult({ "nInserted" : 1 })
> db.user.find() //全部查询
{ "_id" : ObjectId("54feea0a26be41dca9db0d23"), "name" : "zhaoxingzhuang", "age" : 18, "sex" : "man", "location" : { "province" : "shandong", "city" : "jinan", "road" : "shandaroad-47" } }
>

继续执行插入操作

1、简单查询  find({field:"value"},{field:0或者1}) ,前边表示查询的条件  后边表示  查询的字段  0表示 不显示该字段  1表示只显示这个字段

> db.user.insert({name:"wangping",age:26,sex:"woman",location:{city:"beijing",road:"zhongguonongyedaxue"}})
WriteResult({ "nInserted" : 1 })
> db.user.find()
{ "_id" : ObjectId("54feea0a26be41dca9db0d23"), "name" : "zhaoxingzhuang", "age" : 18, "sex" : "man", "location" : { "province" : "shandong", "city" : "jinan", "road" : "shandaroad-47" } }
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "name" : "wangping", "age" : 26, "sex" : "woman", "location" : { "city" : "beijing", "road" : "zhongguonongyedaxue" } }
> db.user.find({name:"wangping"})// 查询name="wangping"
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "name" : "wangping", "age" : 26, "sex" : "woman", "location" : { "city" : "beijing", "road" : "zhongguonongyedaxue" } } //字段选取 类似 sql 语句中的 select age from XXX;
> db.user.find({name:"wangping"},{age:0}) //表示不显示 age字段
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "name" : "wangping", "sex" : "woman", "location" : { "city" : "beijing", "road" : "zhongguonongyedaxue" } } > db.user.find({name:"wangping"},{age:1}) // 表示只取 age字段
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "age" : 26 }
>

2、条件查询 > $gt , < $lt ,<=   $lte ,>=  $gte。

> db.user.find({age:{$gt:20}})   //查询年龄大于20岁的
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "name" : "wangping", "age" : 26, "sex" : "woman", "location" : { "city" : "beijing", "road" : "zhongguonongyedaxue" } }
>

3、$all操作只对数组有效(类似于 $in),    表示要查询的 $all:[1,2,5,6]    1256  必须全部在要查询的数组中 , 而$in 表示只要有一个就符合查询条件。

> db.user.insert({name:"gaofei",age:24,grade:[1,2,5,6],location:{province:"shandong",city:"jiyang",road:"zuozhuangzhen"}})
WriteResult({ "nInserted" : 1 })
> db.user.find(grade:{$all:[1,2,5,6]})
2015-03-10T21:19:20.164+0800 SyntaxError: Unexpected token :
> db.user.find({grade:{$all:[1,2,5,6]}}) //$all 查询条件
{ "_id" : ObjectId("54feef3626be41dca9db0d25"), "name" : "gaofei", "age" : 24, "grade" : [ 1, 2, 5, 6 ], "location" : { "province" : "shandong", "city" : "jiyang", "road" : "zuozhuangzhen" } }
>

$all   $in  只是用在数组上

> db.user.find({name:{$all:[1,2,5,6]}})   //字段不是 数组  的情况
> db.user.find({name:{$in:[1]}})
> db.user.find({grade:{$in:[1]}}) //$in 使用查询
{ "_id" : ObjectId("54feef3626be41dca9db0d25"), "name" : "gaofei", "age" : 24, "grade" : [ 1, 2, 5, 6 ], "location" : { "province" : "shandong", "city" : "jiyang", "road" : "zuozhuangzhen" } }
>

4、skip()   limit()  count()  sort()  使用

其中  skip  跟 limit  使用 类似于   sql语句中的  select * from user limit 0,10;

> db.user.find()    //按照添加顺序列出来
{ "_id" : ObjectId("54feea0a26be41dca9db0d23"), "name" : "zhaoxingzhuang", "age" : 18, "sex" : "man", "location" : { "province" : "shandong", "city" : "jinan", "road" : "shandaroad-47" } }
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "name" : "wangping", "age" : 26, "sex" : "woman", "location" : { "city" : "beijing", "road" : "zhongguonongyedaxue" } }
{ "_id" : ObjectId("54feef3626be41dca9db0d25"), "name" : "gaofei", "age" : 24, "grade" : [ 1, 2, 5, 6 ], "location" : { "province" : "shandong", "city" : "jiyang", "road" : "zuozhuangzhen" } }
//limit 从零开始 查询两条
> db.user.find().limit(2)
{ "_id" : ObjectId("54feea0a26be41dca9db0d23"), "name" : "zhaoxingzhuang", "age" : 18, "sex" : "man", "location" : { "province" : "shandong", "city" : "jinan", "road" : "shandaroad-47" } }
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "name" : "wangping", "age" : 26, "sex" : "woman", "location" : { "city" : "beijing", "road" : "zhongguonongyedaxue" } }
> db.user.skip(1).limit()
2015-03-10T21:26:17.430+0800 TypeError: Property 'skip' of object DEMO.user is not a function
> db.user.find().skip(1).limit() //从第一条开始
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "name" : "wangping", "age" : 26, "sex" : "woman", "location" : { "city" : "beijing", "road" : "zhongguonongyedaxue" } }
{ "_id" : ObjectId("54feef3626be41dca9db0d25"), "name" : "gaofei", "age" : 24, "grade" : [ 1, 2, 5, 6 ], "location" : { "province" : "shandong", "city" : "jiyang", "road" : "zuozhuangzhen" } }
> db.user.count() //统计数据总量
3
> db.user.find().sort(age:1) // 即得要把排序的内容放在 {} 中
2015-03-10T21:27:49.863+0800 SyntaxError: Unexpected token :
> db.user.find().sort({age:1})
{ "_id" : ObjectId("54feea0a26be41dca9db0d23"), "name" : "zhaoxingzhuang", "age" : 18, "sex" : "man", "location" : { "province" : "shandong", "city" : "jinan", "road" : "shandaroad-47" } }
{ "_id" : ObjectId("54feef3626be41dca9db0d25"), "name" : "gaofei", "age" : 24, "grade" : [ 1, 2, 5, 6 ], "location" : { "province" : "shandong", "city" : "jiyang", "road" : "zuozhuangzhen" } }
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "name" : "wangping", "age" : 26, "sex" : "woman", "location" : { "city" : "beijing", "road" : "zhongguonongyedaxue" } }
>

4、$exists 字段存在使用

> db.user.find({age:{$exists:1}})   //查询出存在字段age的记录
{ "_id" : ObjectId("54feea0a26be41dca9db0d23"), "name" : "zhaoxingzhuang", "age" : 18, "sex" : "man", "location" : { "province" : "shandong", "city" : "jinan", "road" : "shandaroad-47" } }
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "name" : "wangping", "age" : 26, "sex" : "woman", "location" : { "city" : "beijing", "road" : "zhongguonongyedaxue" } }
{ "_id" : ObjectId("54feef3626be41dca9db0d25"), "name" : "gaofei", "age" : 24, "grade" : [ 1, 2, 5, 6 ], "location" : { "province" : "shandong", "city" : "jiyang", "road" : "zuozhuangzhen" } }
>

5、$mod    取余数的操作   $mod[要除的数字,余数]

> db.user.find({age:{$mod:[2,1]}})   //查询出除以二余数是一的记录
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "name" : "wangping", "age" : 25, "sex" : "woman", "location" : { "city" : "beijing", "road" : "zhongguonongyedaxue" } }
>

6、$in 表示在  $nin 表示除了

> db.user.find({grade:{$in:[1,3,4]}})  //字段grade 中只要有 1,3,4中其中一个就可以。
{ "_id" : ObjectId("54feef3626be41dca9db0d25"), "name" : "gaofei", "age" : 24, "grade" : [ 1, 2, 5, 6 ], "location" : { "province" : "shandong", "city" : "jiyang", "road" : "zuozhuangzhen" } }
> db.user.find({grade:{$in:[3,4]}}) //表示没有查询到
>

$nin:[数组]  表示只要不再这里面的就符合查询条件  注意   没有这个字段的也符合条件

> db.user.find({grade:{$nin:[3,4]}})
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "name" : "wangping", "age" : 25, "sex" : "woman", "location" : { "city" : "beijing", "road" : "zhongguonongyedaxue" } }
{ "_id" : ObjectId("54feef3626be41dca9db0d25"), "name" : "gaofei", "age" : 24, "grade" : [ 1, 2, 5, 6 ], "location" : { "province" : "shandong", "city" : "jiyang", "road" : "zuozhuangzhen" } }
>

7、复合查询  且   或   既不是也不是

> db.user.find({name:"wangping",age:25})     //表示且的关系
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "name" : "wangping", "age" : 25, "sex" : "woman", "location" : { "city" : "beijing", "road" : "zhongguonongyedaxue" } }
> db.user.find({$or:[{name:"wangping"},{age:26}]}) //或者关系
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "name" : "wangping", "age" : 25, "sex" : "woman", "location" : { "city" : "beijing", "road" : "zhongguonongyedaxue" } }
> db.user.find({$nor:[{name:"wangping"},{age:26}]})
{ "_id" : ObjectId("54feef3626be41dca9db0d25"), "name" : "gaofei", "age" : 24, "grade" : [ 1, 2, 5, 6 ], "location" : { "province" : "shandong", "city" : "jiyang", "road" : "zuozhuangzhen" } }

8、$size  只是针对数组

> db.user.find({grade:{$size:4}})
{ "_id" : ObjectId("54feef3626be41dca9db0d25"), "name" : "gaofei", "age" : 24, "grade" : [ 1, 2, 5, 6 ], "location" : { "province" : "shandong", "city" : "jiyang", "road" : "zuozhuangzhen" } }
>

9、正则表达式

> db.user.find({name:/.*w.*/i})
{ "_id" : ObjectId("54feead226be41dca9db0d24"), "name" : "wangping", "age" : 25, "sex" : "woman", "location" : { "city" : "beijing", "road" : "zhongguonongyedaxue" } }
>

10、db.user.distinct()

> db.user.distinct('name')
[ "wangping", "gaofei" ]
>

11、$eleMatch

The $elemMatch operator matches documents that contain an array field with at least one element that matches all the specified query criteria.

意思是文档中 包含数组的字段中有一个或者多个符合条件就可以

{ _id: 1, results: [ 82, 85, 88 ] }
{ _id: 2, results: [ 75, 88, 89 ] }
db.scores.find(
{ results: { $elemMatch: { $gte: 80, $lt: 85 } } }
)
结果
{ "_id" : 1, "results" : [ 82, 85, 88 ] }

另外还有种情况是 数组是嵌入的例如:

{ _id: , results: [ { product: "abc", score:  }, { product: "xyz", score:  } ] }
{ _id: , results: [ { product: "abc", score: }, { product: "xyz", score: } ] }
{ _id: , results: [ { product: "abc", score: }, { product: "xyz", score: } ] } //The following query matches only those documents
where the results array contains at least one element with both product equal to "xyz" and score greater than or equal to 8.
db.survey.find(
{ results: { $elemMatch: { product: "xyz", score: { $gte: 8 } } } }
)

Single Query Condition  一个查询条件的时候

If you specify a single query predicate in the $elemMatch expression, $elemMatch is not necessary. 不是必须的

For example, consider the following example where $elemMatch specifies only a single query predicate {product: "xyz" }:

db.survey.find(
{ results: { $elemMatch: { product: "xyz" } } }
)

Since the $elemMatch only specifies a single condition, the $elemMatch expression is not necessary, and instead you can use the following query:

db.survey.find(
{ "results.product": "xyz" }
)

12、游标使用

MongoDB中find()函数返回一个游标,客户端通过对游标进行一些设置就能对查询结 果进行有效地控制,如可以限制查询得到的结果数量、跳过部分结果、或对结果集按任意键进行排序等!我们之前在Shell中进行操作,都是直接使用 find()函数,并没有使用其返回值,如:

> for(var i=0;i<100;i++){ db.testcursor.insert({"num":i,"user":"user"+i}); }
WriteResult({ "nInserted" : 1 })
> db.testcursor.find()
{ "_id" : ObjectId("5502c26968baa7224b34c8ee"), "num" : 0, "user" : "user0" }
{ "_id" : ObjectId("5502c26968baa7224b34c8ef"), "num" : 1, "user" : "user1" }
{ "_id" : ObjectId("5502c26968baa7224b34c8f0"), "num" : 2, "user" : "user2" }
{ "_id" : ObjectId("5502c26968baa7224b34c8f1"), "num" : 3, "user" : "user3" }
{ "_id" : ObjectId("5502c26968baa7224b34c8f2"), "num" : 4, "user" : "user4" }
{ "_id" : ObjectId("5502c26968baa7224b34c8f3"), "num" : 5, "user" : "user5" }
{ "_id" : ObjectId("5502c26968baa7224b34c8f4"), "num" : 6, "user" : "user6" }
{ "_id" : ObjectId("5502c26968baa7224b34c8f5"), "num" : 7, "user" : "user7" }
{ "_id" : ObjectId("5502c26968baa7224b34c8f6"), "num" : 8, "user" : "user8" }
{ "_id" : ObjectId("5502c26968baa7224b34c8f7"), "num" : 9, "user" : "user9" }
{ "_id" : ObjectId("5502c26968baa7224b34c8f8"), "num" : 10, "user" : "user10" }
{ "_id" : ObjectId("5502c26968baa7224b34c8f9"), "num" : 11, "user" : "user11" }
{ "_id" : ObjectId("5502c26968baa7224b34c8fa"), "num" : 12, "user" : "user12" }
{ "_id" : ObjectId("5502c26968baa7224b34c8fb"), "num" : 13, "user" : "user13" }
{ "_id" : ObjectId("5502c26968baa7224b34c8fc"), "num" : 14, "user" : "user14" }
{ "_id" : ObjectId("5502c26968baa7224b34c8fd"), "num" : 15, "user" : "user15" }
{ "_id" : ObjectId("5502c26968baa7224b34c8fe"), "num" : 16, "user" : "user16" }
{ "_id" : ObjectId("5502c26968baa7224b34c8ff"), "num" : 17, "user" : "user17" }
{ "_id" : ObjectId("5502c26968baa7224b34c900"), "num" : 18, "user" : "user18" }
{ "_id" : ObjectId("5502c26968baa7224b34c901"), "num" : 19, "user" : "user19" }
Type "it" for more

我们先通过javascript脚本向集合中填充100条文档,然后直接调用find函数。其会自动递归find返回的游标,将前20条数据展示在shell中。如果我们通过变量保留find函数的返回值,其不会自动进行遍历显示操作:

> var cursor = db.coll.find();
 

这样做,实际发生的是,调用完find后,此时Shell并不会去真正地访问数据库, 而是等 待开始要求获得结果的时候才向数据库发送查询请求!我们此时可以对这个游标进行各种设置,然后调用游标的hashNext()或next()方法,这样就 会真正访问数据库,这是一个懒加载的过程。如下

> var cursor=db.testcursor.find();
> while(cursor.hasNext()){
... var perdata=cursor.next();
... print("编号"+perdata.num);
... print("user"+perdata.user);
... }
编号0
useruser0
编号1
useruser1
编号2
useruser2
编号3
useruser3
编号4
useruser4
编号5

上述代码中,当调用cursor.hasNext()时,查询被发往数据库,默认会返回前 100条文档或者前4M的数据(两者之中较小的),这样下次next或hasNext都是本地调用了!当这组数据被遍历完毕,hasNext会导致再次去 访问数据库,直到所有结果被返回!

13、null值查询,当使用 db.testNull.find({"y":null}) 查找字段时包含字段不存在的和值为null的。所以应该使用 {"xxx":{$type:10}}作为查询条件来查找字段值为null的,而{"xxx":{$exists:0}}表示用来查找字段不存在的。  查看 字段 类型值

> db.testNull.insert({"x":1,"y":"String"})
WriteResult({ "nInserted" : 1 })
> db.testNull.insert({"x":1,"y":null})//插入null
WriteResult({ "nInserted" : 1 })
> db.testNull.insert({"x":1}) //不存在y字段
WriteResult({ "nInserted" : 1 })
> db.testNull.find({"y":null}) //查询出来的可能为null的也可能为 字段不存在的
{ "_id" : ObjectId("5502c70868baa7224b34c953"), "x" : 1, "y" : null }
{ "_id" : ObjectId("5502c70e68baa7224b34c954"), "x" : 1 }
> db.testNull.find({"y":{$type:10}}) //查询出来的是字段存在但是数值为 null的 Double 1
{ "_id" : ObjectId("5502c70868baa7224b34c953"), "x" : 1, "y" : null }
> db.testNull.find({"y":{$exists:0}}) //查询出来的是字段不存在的
{ "_id" : ObjectId("5502c70e68baa7224b34c954"), "x" : 1 }

14、$slice  通过$slice返回数组中的部分数据。"$slice":2表示数组中的前两个元素。  负数 截取后边几条数据   [x,y]   x表示从什么地方开始   y 表示数量    [-1,1] 表示从-1位置截取向后截取1个

> db.testSlice.insert({"person":[{"name":"zhaoxingzhuang"},{"name":"libai"},{"name":"dufu"}]})
WriteResult({ "nInserted" : 1 })
> db.testSlice.find({},{"person":{$slice:1}}) //表示从 testSlice中取出person中的一条记录 前提是person必须是数组
{ "_id" : ObjectId("5502cc8a68baa7224b34c955"), "person" : [ { "name" : "zhaoxingzhuang" } ] }
>

mongodb3.2系统性学习——4、find()操作的更多相关文章

  1. mongodb3.2系统性学习——3、update()操作

     mongodb 包含众多的原子性操作: 实例: //连接数据库 dbService = connect("localhost:27017"); //选择插入集合 db = dbS ...

  2. mongodb3.2系统性学习——5、游标 模糊查询 findAndModify函数

    1首先介绍查询结果 返回的过程: 进行查询的时候mongodb 并不是一次哪个返回结果集合的所有文档,而是以多条文档的形式分批返回查询的结果,返回文档到内存中. 好处: 减少了客户端与服务器端的查询负 ...

  3. mongodb3.2系统性学习——2、write concern mongodb 写安全机制

    为了尊重作者原文章位置:http://kyfxbl.iteye.com/blog/1952941 首先讲一下mongodb 的写操作过程: mongodb有一个write concern的设置,作用是 ...

  4. Hbase深入学习(六) Java操作HBase

    Hbase深入学习(六) ―― Java操作HBase 本文讲述如何用hbase shell命令和hbase java api对hbase服务器进行操作. 先看以下读取一行记录hbase是如何进行工作 ...

  5. PHP学习之-数据库操作

    PHP学习之-数据库操作 1.PHP支持那些数据库 PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Sybase,Db2,Or ...

  6. [Python] Python 学习 - 可视化数据操作(一)

    Python 学习 - 可视化数据操作(一) GitHub:https://github.com/liqingwen2015/my_data_view 目录 折线图 散点图 随机漫步 骰子点数概率 文 ...

  7. python入门学习:3.操作列表

    python入门学习:3.操作列表 关键点:列表 3.1 遍历整个列表3.2 创建数值列表3.3 使用列表3.4 元组 3.1 遍历整个列表   循环这种概念很重要,因为它是计算机自动完成重复工作的常 ...

  8. torch Tensor学习:切片操作

    torch Tensor学习:切片操作 torch Tensor Slice 一直使用的是matlab处理矩阵,想从matlab转到lua+torch上,然而在matrix处理上遇到了好多类型不匹配问 ...

  9. Javascript学习笔记二——操作DOM

    Javascript学习笔记 DOM操作: 一.GetElementById() ID在HTML是唯一的,getElementById()可以定位唯一的一个DOM节点 二.querySelector( ...

随机推荐

  1. Python中的迭代器和生成器

    本文以实例详解了python的迭代器与生成器,具体如下所示: 1. 迭代器概述: 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后 ...

  2. USACO月赛数据

    终于找到了usaco月赛的数据…… 根据月赛的名称,我们可以写出数据地址.比如08年一月的月赛即是:http://contest.usaco.org/JAN08  这里要注意区分大小写.

  3. MySQL 创建库

    CREATE DATABASE IF NOT EXISTS database_name DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 这种创建方式能保证数 ...

  4. [Theano] Theano初探

    1. Theano用来干嘛的? Theano was written at the LISA lab to support rapid development of efficient machine ...

  5. 实时控制软件第一次作业--CNC软件系统分析

    作者:李君威U201310747 一.该系统有哪些强实时功能需求?需要对哪些实时事件进行实时响应,对允许的实时延迟的数量级进行估计. 答:在数控系统中,位置控制.插补计算.紧急控制等严格实时性任务需要 ...

  6. angularJS 服务二

    $http服务 一 介绍 AngularJS为我们提供了很多种服务,$http用于发送http请求,动态的请求数据.我们可以使用内置的$http服务直接同外部进行通信.$http服务只是简单的封装了浏 ...

  7. javaweb项目的优化 - 几番思念

    简单地来看一个浏览器用户访问的流程: 浏览器->服务器->返回结果显示  这么简单地看,可能想得到的优化手段很少,常见的可能就是优化sql,加快数据库处理:加个缓存,加快返回:使用静态文件 ...

  8. git上解决代码冲突

    1.切换到master: git co master 2.拉最新代码:git pull origin master 3.删掉多余符号 4.切换到提交的分支:git br Txxxx 5.合并:git  ...

  9. JAX-WS + Spring 开发webservice

    通过几天的时间研究了下使用jax-ws来开发webservice,看了网上的一些资料总结出jax-ws的开发大概分为两种. 以下项目使用的spring3.0,jar包可以到官网下载 第一种:使用独立的 ...

  10. Linux 监控CPU 温度

      安装测试系统: 硬件:普通PC机, 软件:redhat linux as 4  2.6 .9 , 安装系统自带的lm_sensors-2.8.7-2.i386 你也可以从[url]http://w ...