评论

云数据库数组字段查询相关聚合函数in和indexOfArray的使用心得

云数据库数组字段查询相关聚合函数in和indexOfArray的使用心得

一、$.in: db.command.aggregate.in([, ])

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字段,就会直接报错,告诉你第二个参数不是数组。为了避免这个问题,需要增加一个field非空的查询条件。


二、$.indexOfArray: db.command.aggregate.in([, ])

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,所以,要甄别到底输出的是自然数index,-1,还是null。同样的,增加一个field非空的查询条件,就排除了输出为null的情况,让输出结果更简单一些。


下面给一个实例:

该实例中,要统计所有frozen字段中包含x的记录条数。通过$.ifNull对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()


最后一次编辑于  2020-08-19  
点赞 1
收藏
评论
登录 后发表内容