一、$.in: db.command.aggregate.in([, ])
给定一个值和一个数组,如果值在数组中则返回 true,否则返回 false。
示例:
$.in(['x', '$field']) //如果field字段中包含x则输出true
相当于:
where({ filed: 'x' })
特别注意:
由于数据库没有做兼容处理,如果有些记录中没有field字段,就会直接报错,告诉你第二个参数不是数组。为了避免这个问题,需要增加一个field非空的查询条件。
二、$.indexOfArray: db.command.aggregate.in([, ])
在数组中找出等于给定值的第一个元素的下标,如果找不到则返回 -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()