MongoDB的使用学习之(六)MongoDB的高级查询之条件操作符

此文分为两点,主要是在第二点--java
语法,但是按顺序必须先把原生态的语法写出来

(还有一篇文章也是不错的:MongoDB高级查询用法大全(包含MongoDB命令语法和Java语法,其实就是我整理这篇文章的理想模式,阿哈):http://www.cnblogs.com/t2xingzhe/p/3555268.html)

一、javascript语法(原生态语法)

此部分转载自http://blog.csdn.net/u013339851/article/details/23600299

1、条件操作符

<, <=, >, >= 这个操作符就不用多解释了,最常用也是最简单的
 
  db.collection.find({ "field" : { $gt: value } } ); // 大于: field >
value
    db.collection.find({ "field" : { $lt: value } } ); // 小于:
field < value
    db.collection.find({ "field" : { $gte: value }
} ); // 大于等于: field >= value
    db.collection.find({ "field" :
{ $lte: value } } ); // 小于等于: field <= value

如果要同时满足多个条件,可以这样做
    db.collection.find({ "field"
: { $gt: value1, $lt: value2 } } ); // value1 < field < value

2、$all匹配所有
    这个操作符跟SQL 语法的in 类似,但不同的是, in
只需满足( )内的某一个值即可, 而$all 必须满足[ ]内的所有值,例如:
    db.users.find({age :
{$all : [6, 8]}});
    可以查询出 {name: ‘David‘, age: 26, age: [ 6, 8,
9 ] }
    但查询不出 {name: ‘David‘, age: 26, age: [ 6, 7, 9 ] }

3、$exists判断字段是否存在
    查询所有存在age 字段的记录
 
  db.users.find({age: {$exists: true}});
    查询所有不存在name
字段的记录
    db.users.find({name: {$exists: false}});
   
举例如下:
    C1 表的数据如下:
    > db.c1.find();
 
  { "_id" : ObjectId("4fb4a773afa87dc1bed9432d"), "age" : 20, "length" : 30
}
    { "_id" : ObjectId("4fb4a7e1afa87dc1bed9432e"), "age_1" : 20,
"length_1" : 30 }
    查询存在字段age 的数据
    >
db.c1.find({age:{$exists:true}});
    { "_id" :
ObjectId("4fb4a773afa87dc1bed9432d"), "age" : 20, "length" : 30 }
 
  可以看出只显示出了有age 字段的数据,age_1 的数据并没有显示出来

4、Null值处理
    Null
值的处理稍微有一点奇怪,具体看下面的样例数据:
    > db.c2.find()
    {
"_id" : ObjectId("4fc34bb81d8a39f01cc17ef4"), "name" : "Lily", "age" : null
}
    { "_id" : ObjectId("4fc34be01d8a39f01cc17ef5"), "name" :
"Jacky", "age" : 23 }
    { "_id" :
ObjectId("4fc34c1e1d8a39f01cc17ef6"), "name" : "Tom", "addr" : 23 }
 
  其中”Lily”的age 字段为空,Tom 没有age 字段,我们想找到age 为空的行,具体如下:
    >
db.c2.find({age:null})
    { "_id" :
ObjectId("4fc34bb81d8a39f01cc17ef4"), "name" : "Lily", "age" : null }
 
  { "_id" : ObjectId("4fc34c1e1d8a39f01cc17ef6"), "name" : "Tom", "addr" :
23 }
    奇怪的是我们以为只能找到”Lily”,但”Tom”也被找出来了,所以”null”不仅能找到它自身,连不存在age
字段的记录也找出来了。那么怎么样才能只找到”Lily”呢?我们用exists 来限制一下即可:
    >
db.c2.find({age:{"$in":[null], "$exists":true}})
    { "_id" :
ObjectId("4fc34bb81d8a39f01cc17ef4"), "name" : "Lily", "age" : null }
 
  这样如我们期望一样,只有”Lily”被找出来了。

5、$mod取模运算
    查询age 取模10 等于0 的数据
 
  db.student.find( { age: { $mod : [ 10 , 1 ] } } )
   
举例如下:
    C1 表的数据如下:
    > db.c1.find()
 
  { "_id" : ObjectId("4fb4af85afa87dc1bed94330"), "age" : 7, "length_1" :
30 }
    { "_id" : ObjectId("4fb4af89afa87dc1bed94331"), "age" : 8,
"length_1" : 30 }
    { "_id" :
ObjectId("4fb4af8cafa87dc1bed94332"), "age" : 6, "length_1" : 30 }
 
  查询age 取模6 等于1 的数据
    > db.c1.find({age: {$mod : [ 6 , 1
] } })
    { "_id" : ObjectId("4fb4af85afa87dc1bed94330"), "age" :
7, "length_1" : 30 }
    可以看出只显示出了age 取模6 等于1
的数据,其它不符合规则的数据并没有显示出来

6、$ne不等于
    查询x 的值不等于3 的数据
   
db.things.find( { x : { $ne : 3 } } );
    举例如下:
   
C1 表的数据如下:
    > db.c1.find()
    { "_id" :
ObjectId("4fb4af85afa87dc1bed94330"), "age" : 7, "length_1" : 30 }
 
  { "_id" : ObjectId("4fb4af89afa87dc1bed94331"), "age" : 8, "length_1" :
30 }
    { "_id" : ObjectId("4fb4af8cafa87dc1bed94332"), "age" : 6,
"length_1" : 30 }
    查询age 的值不等于7 的数据
    >
db.c1.find( { age : { $ne : 7 } } );
    { "_id" :
ObjectId("4fb4af89afa87dc1bed94331"), "age" : 8, "length_1" : 30 }
 
  { "_id" : ObjectId("4fb4af8cafa87dc1bed94332"), "age" : 6, "length_1" :
30 }
    可以看出只显示出了age 等于7 的数据,其它不符合规则的数据并没有显示出来

7、$in包含
    与sql
标准语法的用途是一样的,即要查询的是一系列枚举值的范围内查询x 的值在2,4,6 范围内的数据
   
db.things.find({x:{$in: [2,4,6]}});
    举例如下:
    C1
表的数据如下:
    > db.c1.find()
    { "_id" :
ObjectId("4fb4af85afa87dc1bed94330"), "age" : 7, "length_1" : 30 }
 
  { "_id" : ObjectId("4fb4af89afa87dc1bed94331"), "age" : 8, "length_1" :
30 }
    { "_id" : ObjectId("4fb4af8cafa87dc1bed94332"), "age" : 6,
"length_1" : 30 }
    查询age 的值在7,8 范围内的数据
    >
db.c1.find({age:{$in: [7,8]}});
    { "_id" :
ObjectId("4fb4af85afa87dc1bed94330"), "age" : 7, "length_1" : 30 }
 
  { "_id" : ObjectId("4fb4af89afa87dc1bed94331"), "age" : 8, "length_1" :
30 }
    可以看出只显示出了age 等于7 或8 的数据,其它不符合规则的数据并没有显示出来

8、$nin不包含
    与sql
标准语法的用途是一样的,即要查询的数据在一系列枚举值的范围外
    查询x 的值在2,4,6 范围外的数据
 
  db.things.find({x:{$nin: [2,4,6]}});
    举例如下:
 
  C1 表的数据如下:
    > db.c1.find()
    { "_id" :
ObjectId("4fb4af85afa87dc1bed94330"), "age" : 7, "length_1" : 30 }
 
  { "_id" : ObjectId("4fb4af89afa87dc1bed94331"), "age" : 8, "length_1" :
30 }
    { "_id" : ObjectId("4fb4af8cafa87dc1bed94332"), "age" : 6,
"length_1" : 30 }
    查询age 的值在7,8 范围外的数据
    >
db.c1.find({age:{$nin: [7,8]}});
    { "_id" :
ObjectId("4fb4af8cafa87dc1bed94332"), "age" : 6, "length_1" : 30 }
 
  可以看出只显示出了age 不等于7 或8 的数据,其它不符合规则的数据并没有显示出来

9、$size数组元素个数
    对于{name: ‘David‘, age: 26,
favorite_number: [ 6, 7, 9 ] }记录
   
匹配db.users.find({favorite_number: {$size: 3}});
   
不匹配db.users.find({favorite_number: {$size: 2}});
   
举例如下:
    C1 表的数据如下:
    > db.c1.find()
 
  { "_id" : ObjectId("4fb4af85afa87dc1bed94330"), "age" : 7, "length_1" :
30 }
    { "_id" : ObjectId("4fb4af89afa87dc1bed94331"), "age" : 8,
"length_1" : 30 }
    { "_id" :
ObjectId("4fb4af8cafa87dc1bed94332"), "age" : 6, "length_1" : 30 }
 
  查询age 的值在7,8 范围外的数据
    > db.c1.find({age:{$nin:
[7,8]}});
    { "_id" : ObjectId("4fb4af8cafa87dc1bed94332"), "age"
: 6, "length_1" : 30 }
    可以看出只显示出了age 不等于7 或8
的数据,其它不符合规则的数据并没有显示出来

10、正则表达式匹配
    查询不匹配name=B*带头的记录
 
  db.users.find({name: {$not: /^B.*/}});
    举例如下:
 
  C1 表的数据如下:
    > db.c1.find();
    { "_id" :
ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20 }
 
  { "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" :
10 }
    查询name 不以T 开头的数据
    > db.c1.find({name:
{$not: /^T.*/}});
    { "_id" :
ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }
 
  可以看出只显示出了name=Tony 的数据,其它不符合规则的数据并没有显示出来

11、Javascript查询和$where查询
    查询a 大于3
的数据,下面的查询方法殊途同归
   db.c1.find( { a : { $gt: 3 } } );
 
 db.c1.find( { $where: "this.a > 3" } );
 
 db.c1.find("this.a > 3");
   f = function() { return
this.a > 3; } db.c1.find(f);
    12、count查询记录条数
   
count 查询记录条数
    db.users.find().count();
   
以下返回的不是5,而是user 表中所有的记录数量
   
db.users.find().skip(10).limit(5).count();
   
如果要返回限制之后的记录数量,要使用count(true)或者count(非0)
   
db.users.find().skip(10).limit(5).count(true);
    举例如下:
 
  C1 表的数据如下:
    > db.c1.find()
    { "_id" :
ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20 }
 
  { "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" :
10 }
    查询c1 表的数据量
    > db.c1.count()
 
  2
    可以看出表中共有2 条数据

13、skip限制返回记录的起点
    从第3 条记录开始,返回5 条记录(limit 3,
5)
    db.users.find().skip(3).limit(5);
   
举例如下:
    C1 表的数据如下:
    > db.c1.find()
 
  { "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" :
20 }
    { "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" :
"Joe", "age" : 10 }
    查询c1 表的第2 条数据
    >
db.c1.find().skip(1).limit(1)
    { "_id" :
ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }
 
  可以看出表中第2 条数据被显示了出来

14、sort排序
    以年龄升序asc
   
db.users.find().sort({age: 1});
    以年龄降序desc
   
db.users.find().sort({age: -1});
    C1 表的数据如下:
   
> db.c1.find()
    { "_id" :
ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20 }
 
  { "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" :
10 }
    查询c1 表按age 升序排列
    >
db.c1.find().sort({age: 1});
    { "_id" :
ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" : "Joe", "age" : 10 }
 
  { "_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" :
20 }
    第1 条是age=10 的,而后升序排列结果集
    查询c1 表按age
降序排列
    > db.c1.find().sort({age: -1});
    {
"_id" : ObjectId("4fb5faaf6d0f9d8ea3fc91a8"), "name" : "Tony", "age" : 20
}
    { "_id" : ObjectId("4fb5fab96d0f9d8ea3fc91a9"), "name" :
"Joe", "age" : 10 }
    第1 条是age=20 的,而后降序排列结果集

二、java语法(spring
data语法)


@Test
public void queryList() {
Query query = new Query();
query.addCriteria(Criteria.where("level").gte(4).lt(12)); //level >= 4 and level < 12
query.addCriteria(Criteria.where("ckey").is("145")); //ckey = 145
query.addCriteria(Criteria.where("area").regex("^1024")); //area like ‘1024%‘
query.with(new Sort(new Sort.Order(Sort.Direction.DESC, "ptime"))); //order by ptime desc
Pagination<News> page = newsService.getPageArticle(1, 10, query);
System.out.println(page.getTotalCount());
if (page != null && page.getDatas() != null && page.getDatas().size() > 0) {
for (News a : page.getDatas()) {
System.out.println(a.getId() + "-" + a.getLevel() + "-" + a.getArea() + "-" + a.getTitle());
}
}
}

执行的MongoDB查询语句是:{ "level" : { "$gte" : 4 , "$lt" : 12} , "ckey" : "145" ,
"area" : { "$regex" : "^1024"}}, Fields: null, Sort: { "ptime" : -1}

可以看出,spring data的语法更加自然,更加符合我们人的思维,更加符合程序猿编码的习惯,系不,哈哈,spring data
果然强大,真的是要垄断java方面的所有事情啊,很可怕的样子,先不讨论这个啦,菜鸟有的用就行,谁方便就用谁的

这个是我自己做测试的代码,没有每个操作符都测试过去啦,有时间再说咯;后面会把项目源码发布出来,供大家拍砖……

  依然,在路上……

时间: 2024-10-09 05:04:39

MongoDB的使用学习之(六)MongoDB的高级查询之条件操作符的相关文章

MongoDB 学习笔记(二) 高级查询

1.条件运算符 2.$all 匹配所有 3.$exists 判断字段是否存在 4.NUll 值处理 5.$mod 取模处理 6.$ne 不等于 7. $in 包含,与sql用法相同 8. $nin 不包含,与sql用法相同 9.$size 数组个数 10.正则表达式 11.$where 查询 12.javascript 查询 13.Count.skip. limit 14.sort 排序 15.游标 16.存储过程 javascript 写法 MongoDB 学习笔记(二) 高级查询

MongoDB快速入门学习笔记3 MongoDB的文档插入操作

1.文档的数据存储格式为BSON,类似于JSON.MongoDB插入数据时会检验数据中是否有“_id”域,如果没有会自动生成.shell操作有insert和save两种方法.当插入一条数据有“_id”值,并且现在集合中已经有相同的值,使用insert插入时插入不进去,使用save时,会更新数据. 1 > db.student.drop() 2 true 3 > db.student.insert({"_id": 1, "name":"zhang

MongoDB快速入门学习笔记7 MongoDB的用户管理操作

1.修改启动MongoDB时要求用户验证加参数 --auth 即可.现在我们把MongoDB服务删除,再重新添加服务 mongod --dbpath "D:\work\MongoDB\data" --logpath "D:\work\MongoDB\log\mongodb.log" --install --serviceName "MongoDB" --auth 2.创建用户,并使用创建的用户登录打开shell操作界面,默认test数据,再查看所

MongoDB快速入门学习笔记5 MongoDB的文档修改操作

db.集合名称.update({query},{update},upsert, multi})query:过滤条件update:修改内容upsert:如果不存在查询条件查出的记录,是否插入一条数据,默认是falsemulti:是否只修改查询条件查出的第一条记录,默认是false > db.student.update({_id:1}, {name:"zhang"}) WriteResult({ "nMatched" : 1, "nUpserted&q

MongoDB快速入门学习笔记8 MongoDB的java驱动操作

import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.bson.Document; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; import com.mongodb.client.FindIterable;

MongoDB快速入门学习笔记4 MongoDB的文档查询操作

先把student删除,再重新插入数据 > db.student.drop() true > db.student.insert([{ "_id" : 1, "name" : "zhangsan", "age": 27, "sex": 1 }, { "_id" : 2, "name" : "lisi", "age":

MongoDB University 第五周作业——aggregate聚合高级查询

HOMEWORK: HOMEWORK 5.2 (HANDS ON) Crunching the Zipcode datasetPlease calculate the average population of cities in California (abbreviation CA) and New York (NY) (taken together) with populations over 25,000. For this problem, assume that a city nam

Oracle学习 第4天之高级查询

与随笔的好处就是可以强迫自已学习,今天本来不想学的,还是多少得学些 下午被一个Bug整惨了,刚好这两天实习生又一直请假,只好自已上(不过今天这事实习生估计搞不定).存储过程里判断相等,没用ISNULL,结果原先的值为NULL,导致更新变成插入,最痛苦是要处理历史数据,对方又没有远程桌面,只好把数据库拷回来写脚本,又要分析数据,有多少张表要处理. 加班到九点,一晃就十点半了,看会视频教程吧: 1.排序:MsSQL有TOP N,MySQL有Limit N,原以为Oracle没有相应的会很麻烦,没想到

Oracle学习 第6天之高级查询

辗转反侧咬牙切齿很久,终于手抖下买了个4T移动硬盘,2.5寸的,USB3.0不用外接电源,看上去不错.天猫店935减10元优惠券,再有个淘宝联盟返现什么的,应该是比较实惠的了. 其实也不一定用的着,但最近宽带升了50M,不用可惜了.电脑已有1T硬盘.2T移动硬盘.3T硬盘各1个了,现在再来个4T移动硬盘...说贵也不贵,同事喜欢机械键盘,短短几个月我印象是第三个了,每个都几百上千,我感觉手感也差不多,总是要消费些什么的吧. 最近想买手机,想买音箱,想买电脑椅...但最终头脑一热还是买了移动硬盘