table1 {
hit:2,
} table2 {
tid:1a2b,
} |
如上两个数据表集合,table2中的tid关联table1中的_id,我需要查询两种情况:
1、table2中满足hit>0,get>0,point在10公里范围内的随机3个结果;
2、table2中满足hit>0,get>0,point在10公里范围内的数量;
以上两种要怎么查询?聚合运算看不太懂,两个表中都有筛选条件的不知道怎么加上去
// 云函数入口函数
exports.main = async(event, context) => {
const _ = db.command
const $ = db.command.aggregate
let getQuery = (point)=>{
return db.collection(‘table1’).aggregate()
.geoNear({
distanceField: ‘distance’,
near: point, // db.Geo.Point对象,如 db.Geo.Point(113.3089506, 23.0968251),
spherical: true,
minDistance: 0,
maxDistance: 10000, // 距离point 10公里范围内
query: {
hit: $.gt(0), // hit > 0
}
})
.lookup({
from: ‘table2’,
localField: ‘_id’,
foreignField: ‘tid’,
as: ‘list’
})
.unwind(’$list’)
.addFields({
tid: ‘$list.tid’,
get: ‘$list.get’,
})
.match({
get: $.gt(0) // get > 0
})
.project({
_id: true,
point: 1,
hit: 1,
get: 1,
distance: 1
})
},
// 统计记录数
count = await getQuery(event.point).count(‘count’).end(),
// 随机3条记录
rows = await getQuery(event.point).sample({size: 3}).end()
return {
count: count.hasOwnProperty(‘list’) && count.list.length == 1 ? count.list[0].count || 0 : 0,
list: rows.hasOwnProperty(‘list’) ? rows.list : []
}
}
===========
小程序端
wx.cloud.callFunction({
name: ‘云函数名称’,
data: {
point: db.Geo.Point(113.3089506, 23.0968251)
}
}).then(res => console.log(res))
.catch(err => console.error(err))