如何使用MongoDB命令对含数组文档实现元素筛选排序并输出指定结果
MongoDB 实现需求的聚合查询
以下是兼容MongoDB 5.2及以上版本的查询语句:
db.collection.aggregate([ // 过滤不存在member字段的文档 { $match: { member: { $exists: true, $ne: null } } }, // 将member数组按joinDate降序排序,取第一个元素即为最新加入的成员 { $addFields: { latestMember: { $first: { $sortArray: { input: "$member", sortBy: { joinDate: -1 } } } } } }, // 展开最新成员字段,添加latest前缀,兼容用户名字段大小写差异 { $addFields: { latestJoinDate: "$latestMember.joinDate", latestUserName: { $ifNull: ["$latestMember.username", "$latestMember.userName"] } } }, // 移除临时字段和原始member数组,保留需要输出的字段 { $project: { member: 0, latestMember: 0 } }, // 按latestJoinDate降序排序 { $sort: { latestJoinDate: -1 } } ])
低版本MongoDB(5.2以下)兼容写法
如果使用的MongoDB版本不支持$sortArray运算符,可以使用以下写法实现相同效果:
db.collection.aggregate([ { $match: { member: { $exists: true, $ne: null } } }, { $unwind: "$member" }, // 按文档_id分组,记录最大joinDate和所有成员信息 { $group: { _id: "$_id", createdAt: { $first: "$createdAt" }, roomName: { $first: "$roomName" }, maxJoinDate: { $max: "$member.joinDate" }, members: { $push: { joinDate: "$member.joinDate", userName: { $ifNull: ["$member.username", "$member.userName"] } } } } }, // 筛选出joinDate等于最大时间的成员 { $addFields: { latestMember: { $first: { $filter: { input: "$members", cond: { $eq: ["$$this.joinDate", "$maxJoinDate"] } } } } } }, // 拼装最终输出字段 { $project: { latestJoinDate: "$latestMember.joinDate", latestUserName: "$latestMember.userName", createdAt: 1, roomName: 1 } }, { $sort: { latestJoinDate: -1 } } ])
两种写法均自动过滤无member字段的文档,兼容示例中username和userName两种字段名差异,输出结果和排序规则完全匹配要求。
内容的提问来源于stack exchange,提问作者ponyo877
相关产品推荐
相关产品推荐

