评论

云数据库$.in和$.indexOfArray的使用心得

云数据库aggregate函数,几个数组函数的使用心得

一、$.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。

示例:

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

特别注意:

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


下面给一个实例:

该实例中,要统计所有frozen字段中包含x的记录条数,考虑了frozen为空的情况,可以用in也可以用indexOfArray来实现。(第一个条件arrayElemAt放在这,是为了说明整个查询比较复杂,需要通过aggregate函数来完成,而不能简单通过filed: value来完成查询。)

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


最后一次编辑于  03-30  
点赞 0
收藏
评论
登录 后发表内容