Skip to main content

Mongo 分页查询-02

MongoDB是一个基于文档的数据存储,因此分页是最常见的用例之一。 那么你什么时候对响应进行分页? 答案非常简洁; 只要您想以块的形式处理结果,就可以进行分页。 一些常见的情况是

  • 批量处理
  • 在用户界面上显示大量结果

客户端和服务器端的分页都非常昂贵,不应该考虑。 因此,分页通常在数据库级别处理,并且数据库也针对此类需求进行了优化。

下面我将向您解释两种方法,通过它们可以轻松地对MongoDB响应进行分页.样本例子:
[code]
{
"_id" : ObjectId("5936d17263623919cd5165bd"),
"name" : "Lisa Rogers",
"marks" : 34
}
[/code]

方法1

使用cursor.skip和cursor.limit
MongoDB游标有两种方法可以简化分页; 他们是
cursor.skip()
cursor.limit()
skip(n)将从光标跳过n个文档,而limit(n)将限制从光标返回的文档数。 因此,两个自然分页的组合响应。

在Mongo Shell中,您的分页代码看起来像这样.

[code]
// Page 1
db.students.find().limit(5)

// Page 2
db.students.find().skip(5).limit(5)

// Page 3
db.students.find().skip(5).limit(5)
[/code]

python 脚本
[python]
def skiplimit(page_size, page_num):
"""returns a set of documents belonging to page number `page_num`
where size of each page is `page_size`.
"""
# Calculate number of documents to skip
skips = page_size * (page_num – 1)

# Skip and limit
cursor = db[‘students’].find().skip(skips).limit(page_size)

# Return documents
return [x for x in cursor]
[/python]

方法2

使用_id和限制
这种方法将有效地利用_id的默认索引和ObjectId的本质。
[code]
// Page 1
db.students.find().limit(10)

// Page 2
last_id = … # logic to get last_id
db.students.find({‘_id’: {‘$gt’: last_id}}).limit(10)

// Page 3
last_id = … # logic to get last_id
db.students.find({‘_id’: {‘$gt’: last_id}}).limit(10)
[/code]
python 脚本
[python]
def idlimit(page_size, last_id=None):
"""Function returns `page_size` number of documents after last_id
and the new last_id.
"""
if last_id is None:
# When it is first page
cursor = db[‘students’].find().limit(page_size)
else:
cursor = db[‘students’].find({‘_id’: {‘$gt’: last_id}}).limit(page_size)

# Get the data
data = [x for x in cursor]

if not data:
# No documents left
return None, None

# Since documents are naturally ordered with _id, last document will
# have max id.
last_id = data[-1][‘_id’]

# Return data and last_id
return data, last_id

[/python]
注意:

如果您使用_id以外的字段进行排序,请确保该字段已加入索引并正确排序,否则性能将受到影响。

参考链接
MongoDB 分页查询的方法及性能
Mongo skip说明

Mongo 数据库 -01

MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
[code]
/* 30 */
{
"_id" : ObjectId("5a60406aca22d9bac08819f8"),
"attributeKey" : "是否确定有一方只含个人",
"attributeName" : "是否确定有一方只含个人",
"expressionIds" : [
"Ex_Law_Has_Just_Person"
],
"logic" : "OR",
"expressionDescriptions" : ""
}
[/code]

Mongo数据库的特点

  • MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
  • 你可以在MongoDB记录中设置任何属性的索引来实现更快的排序。
  • 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。