需求:需要从member , memberMessage两个集合中按照memberId,msgTimesTamp 分组 并返回sex , city , msgTimesTamp。member 中有个memberId 字段是NumberLong 类型的,memberMessage 中的fromUserId 是String类型的。
难点:就是在于 memberId,fromUserId 字段类型不一致, 导致连表查询不出数据
解决方案就是把fromUserId由String 类型 转为NumberLong 类型,因为不熟悉mongodb 的函数就找了很久,于是记录一下
db.messageRoute.aggregate([
{
$project: {
msgTimestamp: {
$dateToString: {
format: "%Y-%m-%d",
date: "$msgTimestamp"
}
},
fromUserId: {
$convert: {
input: "$fromUserId",
to: "long",
onError: "An error occurred",
onNull: "Input was null or empty"
}
}
}
},
{
$match: {
msgTimestamp: {
$gte: '2021-11-01'
},
"$and": [
{
fromUserId: {
$ne: 'sys-system'
}
},
{
fromUserId: {
$ne: 'sys-gift'
}
}
]
}
},
{
$group: {
_id: {
"msgTimestamp": "$msgTimestamp",
"fromUserId": "$fromUserId"
},
msgTimestamp: {
$first: "$msgTimestamp"
},
fromUserId: {
$first: "$fromUserId"
}
}
}
,
{
$lookup: {
// 左连接
from: "memberMongo", // 关联到memberMongo表
localField: "fromUserId",
foreignField: "memberId", // memberMongo 表关联的字段
as: "memberMongo"
}
},
{
$unwind: "$memberMongo"
},
{
$match: {
"memberMongo.sex": 0
}
},
{
$project: {
_id: 0,
msgTimestamp: 1,
username: "$memberMongo.username",
city: "$memberMongo.city"
}
},
{
$sort: {
msgTimestamp: - 1
}
}
]);
用到了**$convert** 操作符,有兴趣的可以查阅一下mongodb中文文档