前言:内容来源于如下PDF,第一部分第四章–>查询
MongoDB中使用find来进行查询.查询就是返回一个集合中文档的子集,子集的范围从0个到整个集合.find的第一个参数决定了要返回那些文档,这个参数是一个文档,用于指定查询条件. 空的查询文档(列如{})会匹配集合的全部内容.要是不指定文档查询,默认就是{}.列如:
db.c.find()
将批量返回集合c中的所有文档. 开始想查询文档中添加键/值对时,就意味着限定了查询条件.对于绝大多数类型来说,这种方式就很简单明了了.数值匹配数据,布尔类型匹配布尔类型,字符串匹配字符串.查询简单的类型,只要指定想要查找的值就好了,十分简单.列如,想要查询"age"值为27的所有文档,直接将这样的键值对写进查询文档就好了.
db.users.find({“age”: 27}) db.users.find({“username”: “joe”}) db.users.find({“username”: “joe”,“age”: 27})
有时并不需要将文档中所有的键值对都返回.遇到这种情况,可以通过find/findOne的第二个参数来指定想要的键.这样做即会节省传输的数据量,又能节省客户端解码文档的时间和内存消耗.列如:标黄的空集合表示查询整个集合的所有文档,后面是展示需要返回的内容:
db.users.find({},{“username”:1,“email”: 1}) 结果;
MongoDB中有两种方式进行OR查询
查询,可以用来查询一个键的多个值, 更通用一些,可以在多个键中查询任意给定的值
查询票号属于:725.542.390的文档 db.raffle.find({"ticket_no":{"$in":[725,542,390]}}) 查询票号不属于:725.542.390的文档 db.raffle.find({"ticket_no":{"$nin":[725,542,390]}}) 查询ticket_no为725或者winner为true的文档 db,raffle.find("$or":[{"ticket_no": 725},{"winner": true}]) 匹配中奖的ticket_no或者winner键的值为true的文档 db,raffle.find("$or":[{"ticket_no": {"$in":[725,542,390]}},{"winner": true}])查找年龄为20-30的所有用户
db.users.find({"age":{"$lt":30,"$gt":20}})null类型的行为有点奇怪,他确实能匹配自身,所有钥匙有一个包含如下文档的集合: 就可以按照预期的方式查询"y"键为null的文档 但是,null不仅会匹配某个键的值为null的文档,而且还会匹配不包含这个键的文档.所以,这种匹配喊会返回缺少这个键的所有文档: 如果仅想匹配键值为null的文档,既要检查该键的值是否为null,还要通过"$exist"添加判定键值已存在:
db.c.find({"z":{"$in":[null],"$exists":true}})很遗憾,没有$eq""操作符号,所以这条查询语句看上去有些令人费解.
查询数组元素与查询标量值是一样的.列如,有一个水果列表,如下所示:
db.food.find({“fruit”:“banana”})
有两种方法可以查询内嵌文档:查询整个文档,或者只针对其键值对进行查询 查询整个内嵌文档与普通查询完全相同:
{ "name":{ "first":"joe", "last":"schmoe" }, "age":45 }还可以:
db.people.find({"name":{"first":joe","last":"schmoe"}})limit: 限制返回的结果,如果结果多,则返回限制数,如果少,则返回有的 db.c.find().limit(3)
skip: 略过前面的文档,若集合中匹配的少于给定的数量,则不会返回任何文档 db.c.find().skip(3)
sort: 接受一个对象作为参数,对象是一组键值对,值表示排序方向,排序方向可以是1(升序)或者-1(降序) db.c.find().sort({username:1,age:-1})
组合使用: 每页返回50个结果,按照价格从高到低排序 db.stock.find({“desc”: “mp3”}).limit(50).sort({“price”:-1})
下一页:跳过前50个结果就好了 db.stock.find({“desc”: “mp3”}).limit(50).skip(50).sort({“price”:-1})
用skip略过少量的文档还是不错的.但是要是熟练非常多的话,skip就会变得很慢,因为要先找到需要被略过的数据,然后再抛弃这些数据.大多数据库都会在索引中保存更多的元数据,用于处理skip,但是MongoDB目前还不支持,所以要尽量避免略过太多的数据.
感受到写书的痛苦了.