云数据库中数组处理相关aggregate函数$.in和$.indexOfArray的使用心得
发布于 4 年前 作者 junzhang 5403 次浏览 来自 分享

一、$.in: db.command.aggregate.in([<value>, <array>])

https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/command/aggregate/AggregateCommand.in.html

给定一个值和一个数组,如果值在数组中则返回 true,否则返回 false。

示例:

$.in([‘x’, ‘$field’]) //如果field字段中包含x则输出true

相当于:

where({ filed: ‘x’ })

特别注意:

这里云数据库并没有做兼容处理,如果有些记录中没有field字段,就会直接报错,告诉你第二个参数不是数组。

二、$.indexOfArray: db.command.aggregate.in([<value>, <array>])

https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/command/aggregate/AggregateCommand.indexOfArray.html

在数组中找出等于给定值的第一个元素的下标,如果找不到则返回 -1。

示例:

$.in([‘x’, ‘$field’]) //输出x在field数组中的位置,如果没找到则输出-1

特别注意:

这里云函数做了兼容处理,如果有些记录中没有field字段,则输出null,所以,有时候要同时处理到底输出的是正常的位置,还是-1,还是null,或者同时对field字段做一个非空查询。

下面给一个实例:该实例中,要统计所有frozen字段中包含x的记录条数,考虑了frozen为空的情况。(第一个条件arrayElemAt请忽略,这个的存在导致整个查询需要通过aggregate函数来完成,而不能简单通过filed: value来匹配。)

let supplierId = 'x'
const allProductsFrozen = await db.collection('products').where(_.expr($.and([
        $.eq([
          $.arrayElemAt(['$supplierId', -1]),
          supplierId
        ]),
        $.ifNull(['$frozen', false]),
        $.neq([$.indexOfArray(['$frozen', supplierId]), -1])
      ]))).count()

回到顶部