1 mongodb查询数据的基本语法
1.1 从可视化工具说起
以下面这款mongodb可视化工具为例,我们可以看到mongo的查询语句由五部分组成分别为
- Query: 非必填,查询条件,较复杂会单独讲;
- Projection: 非必填, 如不填,则返回文档中的所有字段,0表示字段排除,非0表示字段选择并排除其他字段,除了
_id
之外,所有字段必须设置同样的值(看下文中的例子就明白了); - Sort:非必填,排序,1:升序(相当于mysql里的ASC) -1:降序(相当于mysql里的DESC);
- Skip和Limit:非必填,与mysql里limit后的两个参数意义相同,用于分页。
由此我们可以知道 mongodb查询数据的基本语法即为:
db.collection.find(query, projection).sort("XXX",-1).skip(pageNum).limit(pageSize)
1.2 简单体验mongodb的查询语法
假设我们的集合(Collection)如下,我们要查出length为1.77,年龄最大的两个用户的姓名和年龄
{
"_id" : ObjectId("5d35e669f33bf0f85a919171"),
"username" : "lucy",
"country" : "china",
"age" : 18.0,
"height" : 1.79
}
{
"_id" : ObjectId("5d35e669f33bf0f85a919172"),
"username" : "james",
"country" : "English",
"age" : 24.0,
"length" : 1.77
}
{
"_id" : ObjectId("5d35e669f33bf0f85a919173"),
"username" : "deer",
"age" : 22.0,
"length" : 1.77
}
{
"_id" : ObjectId("5d35e669f33bf0f85a919174"),
"username" : "mark",
"country" : "USA",
"age" : 33.0,
"length" : 1.77
}
{
"_id" : ObjectId("5d35e669f33bf0f85a919175"),
"username" : "peter",
"country" : "UK"
}
查询sql如下:
db.users.find(
{ "length" : 1.77}, //查询条件为length为1.77
{ "username" : 1.0, "age" : 1.0} //映射,即查出的每条数据仅显示username和age,
//注意:映射里除了_id外,要么全为0,要么全为非0
)
.sort({ "age" : -1.0}) //按年龄从大到小排序
.limit(2); //skip(0)可以不用写,查询前两条
查询结果如下:
注意:映射里指定只查username和age,但返回的数据里有_id,这个不要奇怪,因为mongo会把_id字段默认给你返回来
{
"_id" : ObjectId("5d35e669f33bf0f85a919174"),
"username" : "mark",
"age" : 33.0
}
{
"_id" : ObjectId("5d35e669f33bf0f85a919172"),
"username" : "james",
"age" : 24.0
}
如果真的不需要_id的话
,我们可以在映射里指定_id
为0,注意,其他字段要么全为0,要么全非0
sql如下:
db.users.find(
{ "length" : 1.77}, //查询条件为length为1.77
{ "_id":0,"username" : 1, "age" : 1} //映射,即查出的每条数据仅显示username和age,
//注意:映射里除了_id外,要么全为0,要么全为非0
)
.sort({ "age" : -1.0}) //按年龄从大到小排序
.limit(2); //skip(0)可以不用写,查询前两条
结果如下:
当然,对于分页少不了查询满足条件的总个数
,查询语句如下:
db.users.find(
{ "length" : 1.77}, //查询条件为length为1.77
{ "username" : 1.0, "age" : 1.0} //映射,即查出的每条数据仅显示username和age,
//注意:映射里除了_id外,要么全为0,要么全为非0
)
.sort({ "age" : -1.0}) //按年龄从大到小排序
.count()//统计总个数---当然统计总个数时可以不关心sort,所以上面的sort可以不用写
查询结果如下
说一下用可视化软件比较爽的地方:
- 我感觉mongo的sql写起来还是比较长的,很容易因为括号等原因出错,而用可视化工具基本不会有这个问题
- sql组装完成后可以按照不同的语言,直接生成相关代码,这就更爽了(我们组最近接了公司里的一个老项目,用的就是java的(2.X dirver API),这酸爽简直不可言喻!!!----之前mongoTemplate用多了,现在感觉这个2.X dirver API其实也蛮好用的☺☺☺)