本意是要在获取离当前定位一定距离的数据,并且需要从uni-id-users表中获取这些数据对应的头像,但是直接通过collection联表是查不了的,会报错。因为聚合操作不支持这样做。
最后折腾了很多种方式只能这样做,因为geonear必须是聚合操作的第一阶段,在geonear之后也接不了where,filed等这些条件。
// 根据定位查询店铺信息
async queryShopsByPosition(params) {
console.log('(parseInt(this.pickerArray[this.pickerIndex]) || 10) * 1000', (parseInt(this.pickerArray[
this.pickerIndex]) || 10) * 1000)
try {
const userLocation = await getUserLocation();
console.log('userLocation', userLocation.longitude, userLocation.latitude);
const db = uniCloud.database();
const geoNearResult = await db.collection('opendb-poi').aggregate().geoNear({
distanceField: 'distance',
spherical: true,
near: new db.Geo.Point(userLocation.longitude, userLocation.latitude), // 人民英雄纪念碑
maxDistance: (parseInt(this.pickerArray[this.pickerIndex]) || 10) * 1000,
}).end();
const userIds = (geoNearResult?.result?.data || []).map(item => item.user_id);
console.log('userIds', userIds);
const avatarResults = await db.collection('uni-id-users').where({
_id: db.command.in(userIds)
}).field('_id,avatar_file').get();
console.log('avatarResults', avatarResults);
// 将两个查询结果合并
let combinedResults = (geoNearResult?.result?.data || []).map(poi => {
let avatar = (avatarResults?.result?.data || []).find(avatar => avatar._id === poi
.user_id);
return {
...poi,
avatar_file: avatar ? avatar.avatar_file : null
};
});
// 解析出当前定位的地址
// let uniMapObj = uniCloud.importObject("uni-map-co")
// let res2 = await uniMapObj.location2address({
// location: `${userLocation.latitude},${userLocation.longitude}`,
// })
// console.log('res_position', combinedResults);
// if (combinedResults?.result?.errCode === 0) {
this.shops = combinedResults;
this.shopsPosition = combinedResults;
console.log('this.shops', this.shops);
// }
} catch (e) {
uni.showToast({
title: "查询出错了",
icon: "error"
})
}
}