① user 表
{
_id: user_1,
openId: 123,
nickName: 爱去宁国,
avatarUrl: http://mp.weixin.com/123.jpg,
points: 100
}
② info 表
{
_id: info_1,
_openid: 123,
createTime: 2020-08-29
}
③ 我想根据 info 表的 _openid 联表查询用户信息,预期返回结果如下:
{
_id: info_1,
_openid: 123,
createTime: 2020-08-29,
creator: {
userId: user_1
nickName: 爱去宁国,
creatorAvatarUrl: http://mp.weixin.com/123.jpg
}
}
哪位老哥指点下,感谢
db.collection('info') .aggregate() .lookup({ from: 'user', pipeline: $.pipeline() .match({ openId: 123, // user 中的 openId }) .project({ creator: { userId: '$_id', nickName: '$nickName', phone: '$phone', avatarUrl: '$avatarUrl', }, }) .done(), as: 'userList', // 输出的数组字段名 }) .replaceRoot({ newRoot: $.mergeObjects([ $.arrayElemAt(['$userList', 0]), '$$ROOT' ]) }) .project({ userList: 0, }) .end() // 亲测
lookup:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/database/aggregate/Aggregate.lookup.html
lookup性能很差,相当于嵌套查询。可以考虑把user表里的内容适当冗余到info表中,查询时直接单表输出。
现在是冗余到 info 表中的,不过由于用户的头像、手机号等信息会更新,所以导致 info 表里的数据有的是不准的。