sample
注意
- 此方法在数据量大的集合高频调用时可能会导致响应缓慢
- 腾讯云数据库操作有默认20的limit,如需使用sample返回20条以上数据,请额外指定limit,例:
sample({size:40}).limit(40)
聚合阶段。随机从文档中选取指定数量的记录。
API 说明
sample 的形式如下:
sample({
size: <正整数>
})
请注意:size 是正整数,否则会出错。
示例
假设文档 users 有以下记录:
{ "name": "a" }
{ "name": "b" }
随机选取
如果现在进行抽奖活动,需要选出一名幸运用户。那么 sample 的调用方式如下:
let res = await db.collection('users')
.aggregate()
.sample({
size: 1
})
.end()
返回了随机选中的一个用户对应的记录,结果如下:
{ "_id": "696529e4-7e82-4e7f-812e-5144714edff6", "name": "b" }
skip
聚合阶段。指定一个正整数,跳过对应数量的文档,输出剩下的文档。
示例
let res = await db.collection('users')
.aggregate()
.skip(5)
.end()
这段代码会跳过查找到的前 5 个文档,并且把剩余的文档输出。
sort
聚合阶段。根据指定的字段,对输入的文档进行排序。
API 说明
形式如下:
sort({
<字段名1>: <排序规则>,
<字段名2>: <排序规则>,
})
<排序规则>可以是以下取值:
- 1 代表升序排列(从小到大);
- -1 代表降序排列(从大到小);
示例
升序/降序排列
假设我们有集合 articles,其中包含数据如下:
{ "_id": "1", "author": "stark", "score": 80, "age": 18 }
{ "_id": "2", "author": "bob", "score": 60, "age": 18 }
{ "_id": "3", "author": "li", "score": 55, "age": 19 }
{ "_id": "4", "author": "jimmy", "score": 60, "age": 22 }
{ "_id": "5", "author": "justan", "score": 95, "age": 33 }
let res = await db.collection('articles')
.aggregate()
.sort({
age: -1,
score: -1
})
.end()
上面的代码在 students 集合中进行聚合搜索,并且将结果排序,首先根据 age 字段降序排列,然后再根据 score 字段进行降序排列。
输出结果如下:
{ "_id": "5", "author": "justan", "score": 95, "age": 33 }
{ "_id": "4", "author": "jimmy", "score": 60, "age": 22 }
{ "_id": "3", "author": "li", "score": 55, "age": 19 }
{ "_id": "1", "author": "stark", "score": 80, "age": 18 }
{ "_id": "2", "author": "bob", "score": 60, "age": 18 }
sortByCount
聚合阶段。根据传入的表达式,将传入的集合进行分组(group)。然后计算不同组的数量,并且将这些组按照它们的数量进行排序,返回排序后的结果。
API 说明
sortByCount 的调用方式如下:
sortByCount(<表达式>)
表达式的形式是:$ + 指定字段。请注意:不要漏写 $ 符号。
示例
统计基础类型
假设集合 passages 的记录如下:
{ "category": "Web" }
{ "category": "Web" }
{ "category": "Life" }
下面的代码就可以统计文章的分类信息,并且计算每个分类的数量。即对 category 字段执行 sortByCount 聚合操作。
let res = await db.collection('passages')
.aggregate()
.sortByCount('$category')
.end()
返回的结果如下所示:Web 分类下有2篇文章,Life 分类下有1篇文章。
{ "_id": "Web", "count": 2 }
{ "_id": "Life", "count": 1 }
解构数组类型
假设集合 passages 的记录如下:tags 字段对应的值是数组类型。
{ "tags": [ "JavaScript", "C#" ] }
{ "tags": [ "Go", "C#" ] }
{ "tags": [ "Go", "Python", "JavaScript" ] }
如何统计文章的标签信息,并且计算每个标签的数量?因为 tags 字段对应的数组,所以需要借助 unwind 操作解构 tags 字段,然后再调用 sortByCount。
下面的代码实现了这个功能:
let res = await db.collection('passages')
.aggregate()
.unwind(`$tags`)
.sortByCount(`$tags`)
.end()
返回的结果如下所示:
{ "_id": "Go", "count": 2 }
{ "_id": "C#", "count": 2 }
{ "_id": "JavaScript", "count": 2 }
{ "_id": "Python", "count": 1 }