// 云函数入口文件 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() if (event.page_token === 0) { 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(['$user_id', OPENID]), $.eq(['$msg_id', '$$msg_id']) ]))) .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 if (event.filter) { let messages = db.collection('message') .aggregate() if (event.filter[1] !== '') { messages = messages.match({ type: event.filter[1] }) } if (event.filter[3] !== '') { messages = messages.match({ tag: db.RegExp({ regexp: event.filter[3], options: 'i' }) }) } messages = messages.lookup({ from: 'publisher', localField: 'pub_id', foreignField: '_id', as: 'publisher' }) .unwind('$publisher') if (event.filter[2] !== '') { if (event.filter[2] === '我关注的') { messages = messages.lookup({ from: 'follow', let: { pub_id: '$pub_id' }, pipeline: $.pipeline() .match(_.expr($.and([ $.eq(['$user_id', OPENID]), $.eq(['$pub_id', '$$pub_id']) ]))) .project({ _id: 0, follow_time: 1 }).done(), as: 'follow' }) .unwind('$follow') } else { messages = messages.match({ 'publisher.type': event.filter[2] }) } } messages = await messages.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 { 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' } } }