mongodb 查询操作,条件查询,where,find等常用操作
此为项目中实际用到的例子
假设有User表
#<User _id: 5497793c73616e2a0c010000, created_at: "2014-12-22T01:51:56.170Z", updated_at: "2015-01-06T03:36:52.689Z", avatar: "2014.png", encrypted_password: “ 23456", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: "2014-12-22T01:48:49.428Z", sign_in_count: 1451, current_sign_in_at: "2014-12-24T02:04:15.075Z", last_sign_in_at: "2014-12-24T02:04:15.055Z", authentication_token: "838PySjM", auth_admin_token: "6kgsWsAFg", name: “ 3221", phone: "16812708279", birthday: "2003-12-22", gender: "male", tags: [], city: nil, works: nil, constellation: "摩羯座", description: nil>
1.find()/findOne()
一般使用find的情况是直接按照id查找
例如:User.find('5497793c73616e2a0c010000')
"{}"是否省略不影响查询,都表示查找集合A下的所有文档。也可以以文档做条件:db.A.find({"a":1,"b":1}),其中查找同时满足属
性a等于1且属性b也等于1的文档,若需要满足属性c等于1,可直接添加到文档中:db.A.find({"a":1,"b":1,"c":1})。
2.指定键的设置
指定键的设置即展示,比如某集合有10个属性,经查询后只关心集合中文档的某几个属性。如下文档:
{ "_id" : ObjectId("5018da521781352fe25bf4d2"), "a" : "1", "b" : "1", "c" : "1", "d" : "1", "e" : "1" }
只关系属性a,b,c可如下设置:
db.A.find({},{"a,":1,"b":1,"c":,"_id":0})
这里的1和0与文档中的键值是不同意义的,这里的1:表示显示,0:表示不显示。其中"_id"键默认存在的,需要显示设置。
结果如下:
{ "a" : "1", "b" : "1", "c" : "1" }
--------------------------------------条件查询可类比结构化查询语句SQL--------------------------------------------
3.条件查询
3.1 条件操作符
"$lt"===================>"<"
"$lte"==================>"<="
"$gt"===================>">"
"$gte"==================>">="
"$ne"===================>"!="
如:某集合B集合中文档有属性x值为整数,需查找10<x<=30的文档,写法如下:
db.B.find({"x":{"$gt":10,"$lte":30}})
如:从某集合B中查找日期属性day值大于2012/01/01的文档数据,写法如下:
db.B.find({"day":{"$gt":new Date("2012/01/01")}})
适合于需要进行日调度、月调度、周调度数据等业务处理范围的场合。
3.2 $in包含/$nin不包含
$in:查询匹配指定条件值的文档;
$nin:查询不匹配指定条件值的文档;
SQL:写法:字段 in ('值1','值1'.....)
mongodb:db.B.find({"x":{"$in":['值1','值2',.....]}})
SQL:写法:字段 not in ('值1','值1'.....)
mongodb:db.B.find({"x":{"$nin":['值1','值2',.....]}})
$in/$nin优点:可指定不同类型条件和值。
3.3 $or或查询
$or:查询匹配多个条件多个值的文档;
SQL:写法:字段1 = 'xxx' or 字段2 in ( 'xxx').....
mongodb:db.B.find({"$or":[{"x":{"$in":['值1','值2'...]}},{"y":"3"}]})
3.4 $all匹配所有
比如文档:
{"name":jack,"age":[1,2,3]}
{"name":jack,"age":[1,4,3]}
db.B.find({"age":{"$all":[2,3]}})结果:{"name":jack,"age":[1,2,3]}
3.5 $exists 判断文档属性是否存在
db.B.find({"name":{"$exists":true}}) --查找属性name存在的文档
db.B.find({"name":{"$exists":false}}) --查找属性name不存在的文档
3.6 属性值为null情况
如下操作并可知道:
> db.C.find()
{ "_id" : ObjectId("5018fccd1781352fe25bf511"), "a" : "14", "b" : "14" }
{ "_id" : ObjectId("5018fccd1781352fe25bf512"), "a" : "15", "b" : "15" }
{ "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }
> db.C.find({"c":null})
{ "_id" : ObjectId("5018fccd1781352fe25bf511"), "a" : "14", "b" : "14" }
{ "_id" : ObjectId("5018fccd1781352fe25bf512"), "a" : "15", "b" : "15" }
{ "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }
可见查询属性c值为null文档,包括属性c值为null、该属性c不存在两个部分。若想只查询属性c为null的文档
如下:
> db.C.find({"c":{"$in":[null],"$exists":true}})
{ "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }
3.7 $not元条件句
可与其他条件配合使用,即不在匹配范围之内的文档,下面可见其用法。
3.8 $mod取模运算
db.B.find({"age":{"$mod":[5,1]}}) --表示查找年龄/5余1的所有文档
若查找年龄/5余1之外的所有文档,可结合$not运算:
db.B.find({"age":{"$not":{"$mod":[5,1]}}})
3.9 正则表达式
db.B.find({"name":/jack/i})
3.10 $size
> db.C.find()
{ "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] }
> db.C.find({"b":{"$size":2}})
{ "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] }
3.11 $slice
返回数组的一个子集,即对以某属性为基础,返回多少条(范围)。也可以接受偏移值和要返回的元素数量,来返回中间的结果。
> db.C.find()
{ "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] }
> db.C.findOne({},{"b":{"$slice":[2,3]}})
{ "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 3 ] }
> db.C.findOne({},{"b":{"$slice":-2}})
{
"_id" : ObjectId("501e71557d4bd700257d8a41"),
"a" : "1",
"b" : [
2,
3
]
}
3.12 $where
即可执行任务javascript作为查询的一部分。
$where的值可以是function、也可以是字符串等等。
db.C.find({"$where":function(){return this.a == "1"}})与db.C.find({"$where":"this.a == '1'"}})
注意:采用$where子句查询在速度上较常规查询慢的多。因文档需要从BSON转换成javascript对象,然后通过"$where"的表达式来运行。
不用利用索引。可用常规查询做前置过滤,配置"$where"查询进行调优,可达到不牺牲性能的要求。
4 游标
使用游标返回find的执行结果,客户端对游标的实现通常能对结果进行数量的限制、略过部分结果、排序等有效控制。
var cursor = db.C.find() --定义游标
while(cursor.hasNext()){
var obj = cursor.next();
print(obj.a);
......
}
db.C.find().limit(10) --限制查询的结果条数为10条
db.C.find().skip(10) --忽略匹配的前10条,显示从第11条匹配的文档开始所有的文档
db.C.find().sort({"a":-1}) --sort以键/值,表示按某个属性进行排序,1:升序,-1:降序
高级查询选项:
$maxscan:integer --指定查询最多扫描的文档数量
$min:document --查询的开始条件
$max:document --查询的结束条件
$hint:document --指定服务器使用哪个索引进行查询
$explain:boolean --获取查询执行的细节(用到的索引、结果数量、耗时等),而并非真正执行查询
$snapshot:boolean --确保查询的结果是在查询执行那一刻的一致快照
mongodb 查询操作,条件查询,where,find等常用操作相关推荐
- NHibernate之旅(4):探索查询之条件查询(Criteria Query)
本节内容 NHibernate中的查询方法 条件查询(Criteria Query) 1.创建ICriteria实例 2.结果集限制 3.结果集排序 4.一些说明 根据示例查询(Query By Ex ...
- Elasticsearch 入门(1):基本概念,安装教程,索引的创建,查询,删除,主键查询,修改,添加,聚合查询,条件查询
Elasticsearch 入门 基本概念 The Elastic Stack, 包括 Elasticsearch.Kibana.Beats 和 Logstash(也称为 ELK Stack).能够安 ...
- 【示例】solr添加文档/删除文档/简单查询/多条件查询
solr添加文档/删除文档/简单查询/多条件查询
- MySQL 基本查询、条件查询、投影查询
文章目录 1. 基本查询 2. 条件查询 3. 投影查询 练习 LeetCode 595. 大的国家 练习 LeetCode 584. 寻找用户推荐人 练习 LeetCode 1173. 即时食物配送 ...
- Mybatis-Plus查询之条件查询(用户名查询)(批量查询)
Mybatis-Plus查询之条件查询(用户名查询)(批量查询) 上代码 上代码 //查询多个用户//Arrays.asList 工具类List<User> users = iUserRe ...
- 1.实现sql语言中DQL语言,实现简单查询、条件查询、排序查询等。
1.实现sql语言中DQL语言,实现简单查询.条件查询.排序查询等. (1)检索grade表当中的所有信息. (2)检索grade表数学成绩大于100的所有人信息. <%@ page langu ...
- MySQL查询之条件查询
前言 之前总结了MySQL查询中的 基础查询 接下来将在本篇进行MySQL中的条件查询的总结 条件查询语句 条件查询就是在基础查询的基础之上,添加判定条件,对数据进行筛选,查找到相对应的数据 这时我们 ...
- mongodb java 多条件查询_MongoDB查询之高级操作详解(多条件查询、正则匹配查询等)...
MongoDB查询之高级操作 语法介绍 MongoDB查询文档使用find()方法,同时find()方法以非结构化的方式来显示所有查询到的文档. -- 1.基本语法 db.collection.fin ...
- MongoDB 添加、查询(条件查询、排序、分页、返回指定字段)、修改、删除数据、聚合aggregate
MongoDB内部支持JavaScript语法,使用SpiderMonkey作为内部的JavaScript解释器引擎. 1.常用命令 show databases:显示数据库列表 use:切换数据库 ...
最新文章
- 行货手机和水货手机究竟啥区别
- PostgreSQL Oracle 兼容性之 - PL/SQL DETERMINISTIC 与PG函数稳定性(immutable, stable, volatile)...
- 快速双边滤波在High-Dynamic Range(HDR)图像显示中的应用。
- oracle 关于日期格式转换与使用
- Linux高效数据统计命令wc
- 微服务架构如何保证安全性?
- 7.24 校内模拟赛
- 变量在函数内外的作用域 3
- GitBash添加tree命令
- java商城项目中多线程执行_java多线程中执行多个程序的实例分析
- 存储过程、游标和触发器
- php 类似百度分页,写了一个仿百度贴吧分页效果的分页类,有人要么?
- ymodem传输的终端工具_国六在线监控OBD终端H6S信息安全防篡改技术实现
- 传感器系列之4.6雨滴传感器
- 判断最小生成树的唯一性
- python的str是什么意思?
- 史上最全机器学习资源整理
- HTML标签的属性和特性
- [FAQ10019]HDMI/MHL如何修改手机默认横竖屏显示方式
- Python处理txt文件:多句分行+行首尾添加字符+for循环--Python新手自练系列
热门文章
- 国内主流平台QMT和Ptrade哪个软件更好用?应该怎么选择?
- 2020年8月20计算机大赛,NOI2020于8月17日正式开幕!今年哪些竞赛选手被保送清北计算机专业?...
- 彩票走势图xcode源码
- 清除浮动的几种方式,以及各自的优缺点
- 医学图像分割UNet
- Linux系统常用命令查看进程的用法
- 阅文java面试_【上海阅文集团Java面试】阅文后端Java,二轮技术一轮HR-看准网
- Vue Get请求数据
- 健康档案管理系统-毕业设计-SSM框架-SpringBoot2.X-VUE-Antd-MyBatis-Shiro
- 李俊峰:碳达峰、碳中和决策不是心血来潮,2030年碳达峰不是一件特别难的事