// 云函数入口文件 const cloud = require('wx-server-sdk') cloud.init() const db = cloud.database() const _ = db.command const $ = db.command.aggregate // 云函数入口函数 exports.main = async (event, context) => { const { OPENID } = cloud.getWXContext() if (event.pub_id) { const messages = await db.collection('message') .aggregate() .match({ pub_id: event.pub_id }) .sort({ publish_time: -1 }) .skip(event.page_token) .limit(event.page_size) .end() return { list: messages.list, next_page_token: event.page_token + messages.list.length, status: 'OK' } } else if (event.keyword) { const regexp = db.RegExp({ regexp: event.keyword, options: 'i' }) const messages = await db.collection('message') .aggregate() .match(_.or([{ name: regexp }, { brief: regexp }, { detail: regexp }])) .sort({ publish_time: -1 }) .skip(event.page_token) .limit(event.page_size) .lookup({ from: 'publisher', localField: 'pub_id', foreignField: '_id', as: 'publisher' }) .unwind('$publisher') .end() await db.collection('search') .add({ data: { user_id: OPENID, keyword: event.keyword || '', search_time: new Date() } }) return { list: messages.list, next_page_token: event.page_token + messages.list.length, status: 'OK' } } else if (event.hot) { const reads = await db.collection('read') .aggregate() .match(_.expr($.lt([$.subtract([new Date(), '$read_time']), 1000 * 60 * 60 * 24]))) .group({ _id: '$msg_id', total: $.sum(1) }) .sort({ total: -1 }) .limit(10) .lookup({ from: 'message', localField: '_id', foreignField: '_id', as: 'message' }) .unwind('$message') .lookup({ from: 'publisher', localField: 'message.pub_id', foreignField: '_id', as: 'message.publisher' }) .unwind('$message.publisher') .end() return { list: reads.list, status: 'OK' } } else if (event.favorite) { const messages = await db.collection('message') .aggregate() .lookup({ from: 'favorite', let: { msg_id: '$_id' }, pipeline: $.pipeline() .match(_.expr($.and([$.eq(['$msg_id', '$$msg_id']), $.eq(['$user_id', OPENID])]))) .project({ _id: 0, favorite_time: 1 }).done(), as: 'favorite' }) .unwind('$favorite') .skip(event.page_token) .limit(event.page_size) .lookup({ from: 'publisher', localField: 'pub_id', foreignField: '_id', as: 'publisher' }) .unwind('$publisher') .end() return { list: messages.list, next_page_token: event.page_token + messages.list.length, status: 'OK' } } else { const messages = await db.collection('message') .aggregate() .sort({ publish_time: -1 }) .skip(event.page_token) .limit(event.page_size) .lookup({ from: 'publisher', localField: 'pub_id', foreignField: '_id', as: 'publisher' }) .unwind('$publisher') .end() return { list: messages.list, next_page_token: event.page_token + messages.list.length, status: 'OK' } } }