一 创建数据库
执行操作进入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" } ] } >