博客
原文收藏于IT老兵驿站。
语法
1 | db.collection.find(query, projection) |
在集合或者视图的文档中进行选择,并且返回一个指向被选中的文档的游标。(原文是:Selects documents in a collection or view and returns a cursor to the selected documents.)
参数|类型|描述
-|-|-
query|文档型|可选。使用查询操作符(参考这里),指定了查询过滤器。 想要返回集合中所有的文档,忽略这个参数,或者传一个空的文档({})。
projection|文档型|可选。制定了匹配查询过滤器,要返回的文档的域。想要返回匹配的文档中的所有域,忽略这个参数。
projection参数决定了哪些域需要被返回。
1 | { field1: <value>, field2: <value> ... } |
<value>
可以是:
- 1 或 true 表示要在返回文档中包含这个域。
- 0 或 false 表示不包含这个域。
- 表达式使用了投影操作符(有待解释)。
分析
基本的查找参考上面的语法即可,下面也有实例,其实较为难以掌握的是组合查找,例如逻辑关系是AND
的,或者是OR
的,还有IN
的,这几个需要梳理一下。
实例
实例 查找上文test集合中的所有文档。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19db.test.find().pretty()
{
"_id" : ObjectId("5abb3b5bce69c048be080199"),
"meta" : {
"createAt" : ISODate("2018-03-28T06:51:07.579Z"),
"updateAt" : ISODate("2018-03-28T06:51:07.579Z")
},
"a" : "1",
"b" : "1"
}
{
"_id" : ObjectId("5abb3b5bce69c048be080120"),
"meta" : {
"createAt" : ISODate("2018-03-28T06:51:07.579Z"),
"updateAt" : ISODate("2018-03-28T06:51:07.579Z")
},
"a" : "1",
"b" : "3"
}
pretty()
是用来让展示更加舒适。
实例 查找test集合中的b="3"
的记录,这里要注意“3”
和3
是不一样的,这里是要符合js的语法,字符串和数字表示方式是不同的。做一个好的程序员,一定要严谨,而做到了严谨,可以帮你更快地提高,更快地产出,更好地规避错误,其实加快了你的职场发展节奏。1
2
3
4
5
6
7
8
9
10db.test.find({b: "3"}).pretty()
{
"_id" : ObjectId("5abb3b5bce69c048be080120"),
"meta" : {
"createAt" : ISODate("2018-03-28T06:51:07.579Z"),
"updateAt" : ISODate("2018-03-28T06:51:07.579Z")
},
"a" : "1",
"b" : "3"
}
可以看到,这次只查出了一条符合条件的记录。
实例 查找test集合中的b="3"
的记录a和b两个域,不要其它域。
1 | db.test.find({b: "3"}, {a: 1, b: 1}).pretty() |
可以看到,没有涉及的域就没有再获取出来,这样在一些情况下是可以节省网络开销和分析成本的,在《高性能MySQL》也是讲过类似的原理,不要大而全地去把所有内容获取回来,对于资源的使用,应该是有规划的、经济地去使用。
实例 查找test集合中的b="3"
并且a="4"
的记录。1
db.test.find({b: "3", a: "4"}}).pretty()
可以看到,在第一个{}
中逗号分隔开的是AND
的查询关系。
实例 查找test集合中的b="3"
或者b="4"
的记录。1
db.test.find({b: {$in: ["3", "4"]}}).pretty()
这个语法的原则是操作符$in
在前,作为JSON名值对的名,["3", "4"]
是它的值,然后整个{$in: ["3", "4"]}
作为b的值,从JSON语法的角度去思考和记忆这个语法,就容易一些了。
实例 修改一下上面的例子,查找test集合中的b="3"
或者a="4"
的记录。1
db.test.find({$or: [{b: "3"}, {a: "4"}]}).pretty()
这个语法和IN
的道理是一样的,其实AND
也可以这么用,上面那种是隐式的用法,显式的用法是这样:1
db.test.find({$and: [{b: "3"}, {a: "4"}]}).pretty()
实例 按照某个字段来排序1
db.bios.find().sort( { name: 1 } )
实例 约束返回条数1
db.bios.find().limit( 5 )
查询操作符还有一些大于、小于等操作,具体参考查询操作符一节,两者结合起来一起看,就能搞明白了。
总结
本文只是总结了MongoDB查询的一部分的功能,MongoDB是NoSQL的,没有统一的模式,以一个json对象来保存记录,而查询主要是根据这个json对象的健值来做判断。
参考
https://docs.mongodb.com/manual/reference/method/db.collection.find/。