一、$.in: db.command.aggregate.in([<value>, <array>])
给定一个值和一个数组,如果值在数组中则返回 true,否则返回 false。
示例:
$.in([‘x’, ‘$field’]) //如果field字段中包含x则输出true
相当于:
where({ filed: ‘x’ })
特别注意:
这里云数据库并没有做兼容处理,如果有些记录中没有field字段,就会直接报错,告诉你第二个参数不是数组。
二、$.indexOfArray: db.command.aggregate.in([<value>, <array>])
在数组中找出等于给定值的第一个元素的下标,如果找不到则返回 -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()