MongoDB查询

find查询

find的第一个参数是返回哪些文档,类是于sql里面的where语句

如在集合user里面就是

> db.user.find()

其中默认参数为{},默认会查询全部的内容。当我们在查询文档中添加键值,就表示了查询的条件,如:

> db.user.find()
{ "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [  2,  3,  3,
  4 ], "password" : "a", "username" : "wangwu" }
{ "_id" : ObjectId("51ba745f5fdf5d2d7426eb35"), "abc" : 123, "age" : 1 }
> db.user.find({age:2});
{ "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [  2,  3,  3,
  4 ], "password" : "a", "username" : "wangwu" }
>

查询多个键值时

> db.user.find({age:2});
{ "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [  2,  3,  3,
  4 ], "password" : "a", "username" : "wangwu" }
> db.user.find({age:2,username:'wangwu'});
{ "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [  2,  3,  3,
  4 ], "password" : "a", "username" : "wangwu" }
> db.user.find({age:2,username:'wangwu',password:'abc'});
>

指定返回键

有时候我们并不需要所有满足条件的都返回,可以用find的第二个参数来指定想要的键,这样即会节约传输的数据量,也会节约客户端的解析时间。

当我们需要的时候就将指定键的值设置为1,不需要就设置为0,其中_id为必须返回值

> db.user.find({age:2},{username:0});
{ "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [  2,  3,  3,
  4 ], "password" : "a" }
> db.user.find({age:2},{username:1});
{ "_id" : ObjectId("51b28f74b73ec06e42c91598"), "username" : "wangwu" }

查询条件

操作符 表示
$lt <
$lte <=
$gt >
$gte >=

例如查询年龄在(1,10)之间的文档

> db.user.find({age:{$lt:10,$gt:1}});
{ "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [  2,  3,  3,
  4 ], "password" : "a", "username" : "wangwu" }

or查询

MongoDB中的or查询有两种方式

$in可以用来查询一个键的多个值,和sql里面的in类似

> db.user.find({age:{$in:[1,2]}});
{ "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [  2,  3,  3,
  4 ], "password" : "a", "username" : "wangwu" }
{ "_id" : ObjectId("51ba745f5fdf5d2d7426eb35"), "abc" : 123, "age" : 1 }
>

$or用来完成多个键的任意给定值,和sql的or类似,

> db.user.find({$or:[{age:2},{abc:123}]})
{ "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [  2,  3,  3,
  4 ], "password" : "a", "username" : "wangwu" }
{ "_id" : ObjectId("51ba745f5fdf5d2d7426eb35"), "abc" : 123, "age" : 1 }
>

or里面还可以包含其他条件,如将age的条件2修改成前面的$in:[1,2]。

特定类型查询

null

匹配null和不存在类型,如果要只匹配null需要用$exists:true来来判断

正则表达式

正则表达式能够灵活的匹配字符串

ps.有点类是于sql里面的like,但是比like要灵活的多

语法以/开头/结尾,和javascript中的正则表达式相同

如查询用户名中包含w的用户

> db.user.find({username:/w/})
{ "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [  2,  3,  3,
  4 ], "password" : "a", "username" : "wangwu" }

查询数组

直接查询

> db.user.find({arr:2});
{ "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [  2,  3,  3,
  4 ], "password" : "a", "username" : "wangwu" }

匹配多个 $all

> db.user.find({arr:{$all:[2,3]}});
{ "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [  2,  3,  3,
  4 ], "password" : "a", "username" : "wangwu" }
>

查询指定长度的数组 $size

> db.user.find({arr:{$size:3}});
> db.user.find({arr:{$size:4}});
{ "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [  2,  3,  3,
  4 ], "password" : "a", "username" : "wangwu" }
>

返回指定的数据条数 $slice

> db.user.findOne({age:2},{arr:{$slice:2}});
{
        "_id" : ObjectId("51b28f74b73ec06e42c91598"),
        "age" : 2,
        "arr" : [
                2,
                3
        ],
        "password" : "a",
        "username" : "wangwu"
}
>

 

$where查询

$where可以执行任意javascript语句作为查询的一部分

> db.user.find({$where:function(){if(this.age==2)return true ; return false;}});

{ "_id" : ObjectId("51b28f74b73ec06e42c91598"), "age" : 2, "arr" : [  2,  3,  3,
  4 ], "password" : "a", "username" : "wangwu" }
>

游标

数据库使用游标来返回find的执行结果

当调用find的时候,shell并不立即查询数据库,而是等待真正开始获取结构的时候才发送查询请求。

limit(n) 限制返回结构数量

skip(n) 忽略指定数量

sort ({x1:n1,x2:n2……}) 排序n为1升序 –1 降序

posted @ 2013-06-14 16:22  张巍的博客  阅读(320)  评论(0编辑  收藏  举报