MongoDB 查询 (转) 仅限于C++开发
1.find
MongoDB使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数
决定了要返回哪些文档.其形式也是一个文档,说明要查询的细节.
空的查询文档{}会匹配集合的全部内容.要是不指定查询文档,默认是{}.
如:db.users.find()返回集合users中的所有内容.
向查询文档中添加键值对,就意味着添加了查询条件.对绝大多数类型来说,整数匹配整数,布尔类型匹配布尔类型,字符串匹配
字符串.
2.指定返回的键
有时并不需要返回文档中的所有键值对返回.可以通过find或findOne的第二个参数来指定要返回的键.这样做能节省传输的
数据量,又能节省客户端解码文档的时间和内存消耗.

db.users.findOne({"name":"refactor"},{"age":1,"sex":1})
只会将键为_id,age,sex的数据返回.
"_id"键总是会被返回.
也可以用第二个参数来剔除查询结果中的某个键值对.
如:
键name不会显示在返回的结果中
db.users.findOne({"name":"refactor"},{"name":0})
只会将键为age,sex的数据返回."_id"键是不会返回的
db.users.findOne({"name":"refactor"},{"age":1,"sex":1,"_id":0})
3.查询条件
"$lt","$lte","$gt","$gte"分别对应<,<=,>,>=
如:
查询age >=18 <=30
db.users.find({"age":{"$gte":18,"$lte":30}})
向文档增加键birthday
db.users.update(
{"name":"refactor"},
{
"$set":
{
"birthday":new Date("1989/10/26")
}
}
)
查询birthday日期是1990-1-1之前的人
db.users.find({"birthday":{"$lt":new Date("1990/01/01")}})
使用"$ne"
查出所有name不等refactor1的文档,注意 文档中不存在键name的文档也会被查出来
db.users.find({"name":{"$ne":"refactor1"}})
使用or查询
MongoDB可以使用"$in","$or"
使用"$in"
查询出pageViews为10000,20000的数据
db.users.find({pageViews:{"$in":[10000,20000]}})

"$in"可以指定不同类型的条件和值,如正在将用户的ID号迁移成用户名的过程中,要做到两者兼顾的查询:
db.users.find({"user_id":{"$in":[12345,"refactor"]}})
这会匹配user_id为12345和"refactor"的文档.
要是 "$in"的数组只有一个值和直接匹配这个值效果是一样的.
db.users.find({"pageViews":{"$in":[10000]}})
db.users.find({"pageViews":10000})
使用"$nin"返回与数组中所有条件都不匹配的文档
如 查出所有pageViews不等10000,20000的文档,注意 文档中不存在键pageViews的文档也会被查出来
db.users.find({"pageViews":{"$nin":[10000,20000]}})
"$in"能对单个键进行or查询.
使用"$or"
db.users.find(
{
"$or":
[
{"pageViews":{"$in":[10000,20000]}},
{"url":"http://www.cnblogs.com/refactor"}
]
}
)
这将查询出pageViews是10000,20000或url是http://www.cnblogs.com/refactor的文档.
注意:使用普通的and查询时,要尽量将最苛刻的条件放在前面.
使用"$not"
"$not"可以用在任何条件之上.
如:
db.users.find(
{"id_num":{"mod":[5,1]}}
)
这会查询出id_num取模后值为1的文档.
db.users.find(
{"id_num":{"$not":{"mod":[1,5]}}}
)
4.条件句的规则
在查询中,"$lt"在内层文档,在更新中"$inc" 是外层文档的键.
条件句是内层文档的键,修改器是外层文档的键.
可对一个键应用多个条件,但一个键不能对应多个更新修改器.
5.特定于类型的查询
null可以匹配自身,而且可以匹配"不存在的"

能查出url 是"http://www.cnblogs.com/refactor",pageViews为null的文档
db.users.find({"url":"http://www.cnblogs.com/refactor","pageViews":null})
能查出pageViews为null的文档,不存在键pageViews的也能查出来
db.users.find({"pageViews":null})
能查出url 是"http://www.cnblogs.com/refactor",pageViews为null的文档,但不能查出不存在键pageViews的的文档
db.users.find({"url":"http://www.cnblogs.com/refactor","pageViews":{"$in":[null],"$exists":true}})
MongoDB没有"$eq"操作符,但是只有一个元素的"$in"的操作效果是一样的
如果仅仅想要匹配键值为null的文档,既要检查该键的值是否为null,还要通过"$exists"条件判断该键是不是存在.
6.正则表达式
正则表达式能够灵活有效的匹配字符串.
查找所有名包含refact或Refact的用户,使用正则表达式执行忽略大小写的匹配
db.users.find({"name":/refact/i})
系统可以接受正则表达式标识(i),但不是一定有.现在匹配了各种大小写形式的refact.
MongoDB可以为前缀型正则表达式(如:/^refactor/)查询创建索引.所以这种类型的查询非常高效.
正则表达式也可以匹配自身
如
db.users.find({"name":/refact/})
可以查出name为/refact/的文档.
7.查询数组
数组很大多数情况下可以这样理解:每一个元素都是整个键的值.

db.users.findOne({"userName":"refactor","emails":"295240648@qq.com"})能匹配到
使用"$all"
如果需要多个元素来匹配数组,就要用"$all"
db.users.insert({"userName":"refactor",emails:["295240648@qq.com","295240648@163.com","295240648@126.com"]})
db.users.insert({"userName":"refactor",emails:["295240648@qq.com","295240648@126.com","295240648@111.com"]})
db.users.insert({"userName":"refactor",emails:["295240648@126.com","295240648@163.com","295240648@111.com"]})
要找到邮箱有"295240648@163.com"又有"295240648@126.com",顺序无关紧要的文档
db.users.find(
{
"emails":
{
"$all":
[
"295240648@163.com",
"295240648@126.com"
]
}
}
)
要是只对一个元素的数组使用"$all"就和不用"$all"是一样的,如
db.users.find({"emails":{"$all":["295240648@126.com"]}})
db.users.find({"emails":"295240648@126.com"})
效果是一样的.
也可以精确的匹配数组
db.users.find({"userName":"refactor",emails:["295240648@qq.com","295240648@163.com","295240648@126.com"]})
若想查询数组指定位置的元素,需要使用key.index语法指定下标
db.users.find({"emails.1":"295240648@163.com"})
使用"$size"
"$size"可以查询指定长度的数组
查询数组长度为3的数组
db.users.find({"emails":{"$size":3}})
常见的查询是数组长度范围的查询."$size"并不能与其他查询子句组合(如:"$gt"),但是这种查询可以通过
在文档中添加一个"size"键的方式来实现.这样每一次向指定数组添加元素的时候,同时增加"size"值.原来这样
的更新:
db.users.update({"$push":{"emails":"295240648@139.com"}})
变成这样的更新:
db.users.update({"$push":{"emails":"295240648@139.com"},"$inc":{"size":1}})
这样就可以这样查询了
db.users.find({"size":{"$gt":3}})
使用"$slice"查询
find的第二个参数是可选的,可以指定返回那些键,"$slice"返回数组的一个子集合
返回emails数组的前两个元素
db.users.find({"userName":"refactor"},{"emails":{"$slice":2}})
返回emails数组的后两个元素
db.users.find({"userName":"refactor"},{"emails":{"$slice":-2}})
返回emails数组的第2个和第11个元素.如果数组不够11个,则返回第2个后面的所有元素
db.users.find({"userName":"refactor"},{"emails":{"$slice":[1,10]}})
"$slice"默认将返回文档中的所有键.
MongoDB 查询 (转) 仅限于C++开发的更多相关文章
- MongoDB 聚合 (转) 仅限于C++开发
MongoDB除了基本的查询功能,还提供了很多强大的聚合工具,其中简单的可计算集合中的文档个数, 复杂的可利用MapReduce做复杂数据分析. 1.count count返回集合中的文档数量 db. ...
- MongoDB查询操作限制返回字段的方法
这篇文章主要介绍了MongoDB查询操作限制返回字段的方法,需要的朋友可以参考下 映射(projection )声明用来限制所有查询匹配文档的返回字段.projection以文档的形式列举结果集中 ...
- mongodb查询语句
左边是mongodb语句,右边是sql语句 db.users.find() select * from users db.users.find({"age" : 27}) sele ...
- 解决ORA-00257: 归档程序错误。在释放之前仅限于内部连接
昨天尝试通过plsqldev尝试连接oracle数据库,报错,提示ORA-00257: 归档程序错误.在释放之前仅限于内部连接 通过查询,得知原因是archivedlog达到了数据库设置的空间限制. ...
- SWF 文件不能本地访问 只有仅限于文件系统的 SWF 文件
http://blog.163.com/vituk93@126/blog/static/1709580342012512112757505/ SWF 文件不能被本地访问 不能访问本地 只有仅限于文件系 ...
- mongodb查询语句与sql语句对比
左边是mongodb查询语句,右边是sql语句.对照着用,挺方便. db.users.find() select * from users db.users.find({"age" ...
- MongoDB查询转对象是出错Element '_id' does not match any field or property of class
MongoDB查询转对象是出错Element '_id' does not match any field or property of class 解决方法: 1.在实体类加:[BsonIgno ...
- mongodb查询文档
说到查询,我们一般就想起了关系型数据库的查询了,比如:order by(排序).limit(分页).范围查询(大于某个值,小于某个值..,in查询,on查询,like查询等待很多),同样mongodb ...
- [转]mongodb 查询条件:关系运算符"$lt", "$lte", "$gt", "$gte", "$ne" 逻辑运算符"$and“, "$or“, "$nor“
mongodb 查询条件 这节来说说mongodb条件操作符,"$lt", "$lte", "$gt", "$gte" ...
随机推荐
- a、b交换与比较
1.有两个变量a,b,不用if.?: .switch 或其他判断语句,找出两个数中 较大的: int max = ((a+b)+abs(a-b))/2 较小的: int min = ((a+b)-ab ...
- VC++多工程项目
目录 第1章 VC++6.0 1 1.1 设置依赖关系 1 1.2 编译顺序 2 1.3 自动连接 3 1.4 静态库 3 1.4.1 嵌入 3 1.4.2 替换 ...
- Working with Data » Getting started with ASP.NET Core and Entity Framework Core using Visual Studio » 创建复杂数据模型
Creating a complex data model 创建复杂数据模型 8 of 9 people found this helpful The Contoso University sampl ...
- controller 监控Unix性能信息
linux系统需要有RPC(Remote Procedure Call Protocol),远程过程调用协议,通过安装rpc.rstatd程序,启动其服务,就可以给远程机器提供信息,即Lr可以获取到该 ...
- c语言数据结构:递归的替代-------回溯算法
1.要理解回溯就必须清楚递归的定义和过程. 递归算法的非递归形式可采用回溯算法.主要考虑的问题在于: 怎样算完整的一轮操作. 执行的操作过程中怎样保存当前的状态以确保以后回溯访问. 怎样返回至上一次未 ...
- css读书笔记2:css工作原理
css就是一种先选择html元素,然后设定选中元素css属性的机制.css选择符合要应用的样式构成一条css规则. 为文档添加样式的3种方法: 1.行内样式,直接写在特定标签的style属性中:2.嵌 ...
- 【CITE】利用鼠标绘图C#
实例018 利用鼠标绘图 光盘位置:光盘\MR\01\018 在常用的画图软件中,用户一般都可以通过鼠标在其中绘图,那么该功能是如何实现的呢?本实例将讲解如何使用C#实现通过拖动鼠标在窗体上绘图的功能 ...
- Simplify Path [LeetCode]
Given an absolute path for a file (Unix-style), simplify it. For example,path = "/home/", ...
- iOS App从点击到启动
程序启动之前 从exec()开始 main()函数是整个程序的入口,在程序启动之前,系统会调用exec()函数.在Unix中exec和system的不同在于,system是用shell来调用程序,相当 ...
- Hdu4349 Xiao Ming's Hope
Xiao Ming's Hope Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...