unicloud随机聚合查询

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 }

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注