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)
MongoDB总结整理2 --- mongodb文档查询1【mongodb查询语法介绍】_MongoDB


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)可以不用写,查询前两条

结果如下:
MongoDB总结整理2 --- mongodb文档查询1【mongodb查询语法介绍】_MongoDB_02


当然,对于分页少不了查询满足条件的总个数,查询语句如下:

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可以不用写

查询结果如下
MongoDB总结整理2 --- mongodb文档查询1【mongodb查询语法介绍】_MongoDB_03


说一下用可视化软件比较爽的地方:

  • 我感觉mongo的sql写起来还是比较长的,很容易因为括号等原因出错,而用可视化工具基本不会有这个问题
  • sql组装完成后可以按照不同的语言,直接生成相关代码,这就更爽了(我们组最近接了公司里的一个老项目,用的就是java的(2.X dirver API),这酸爽简直不可言喻!!!----之前mongoTemplate用多了,现在感觉这个2.X dirver API其实也蛮好用的☺☺☺)

MongoDB总结整理2 --- mongodb文档查询1【mongodb查询语法介绍】_MongoDB_04