mongoDB之find()操作

一 创建数据库

 执行操作进入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   英文的  文档是

{ _id: 1, results: [ { product: "abc", score: 10 }, { product: "xyz", score: 5 } ] } { _id: 2, results: [ { product: "abc", score: 8 }, { product: "xyz", score: 7 } ] } { _id: 3, results: [ { product: "abc", score: 7 }, { product: "xyz", score: 8 } ] }
db.survey.find(

   { results: { $elemMatch: { product: "xyz", score: { $gte: 8 } } } }

)

 

 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表示数组中的前两个元素。

> 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" } ] }

> 

 

你可能感兴趣的:(mongodb)