javascript - 从不同的集合 Mongoose 返回字段
问题描述
想象一个按用户名查找用户并返回他们的函数。
User.aggregate(
[
{ $sort: { userFirstName: 1, userLastName: 1 } },
{
$addFields: {
firstLastName: { $concat: ['$userFirstName', ' ', '$userLastName'] },
lastFirstName: { $concat: ['$userLastName', ' ', '$userFirstName'] }
}
},
{
$match: $match // Set from above with match crit
},
{
$group: {
_id: null,
total: { $sum: 1 },
data: {
$push: {
'_id': '$_id',
'userFirstName': '$userFirstName',
'userLastName': '$userLastName',
'userProfileImage': '$userProfileImage',
'userVihorCategory': '$userVihorCategory'
}
}
}
},
{
$project: {
total: 1,
data: { $slice: ['$data', start, limit] }
}
}
]
).exec((errAgg, results) => {...
这有效,它拼接它们并正确返回它们。还有另一个跟踪用户连接的集合。
{
user: { type: Schema.Types.ObjectId, ref: 'User' },
userConnection: { type: Schema.Types.ObjectId, ref: 'User' },
userConnectionStatus: {
type: String,
enum: ['following', 'blocked', 'requested']
}
}
例如用户:我,userConnection:'某人',userConnectionStatus:'following'
我想要实现的是再返回 2 个字段,1.我的 userConnectionStatus 给他 2.他的 userConnectionStatus 给我
并且不返回阻止我的用户。对于这种数据库结构,最好的方法是什么。
感谢您的时间
解决方案
通过选择所有被阻止的用户并在聚合内的匹配中添加 $nin 来解决阻止被阻止用户的问题。
对于连接状态,我通过向用户添加 2 个虚拟字段来解决问题。
UserMongoSchema.virtual('userConnectionStatus', {
ref: 'UserConnection',
localField: '_id',
foreignField: 'user',
justOne: true
});
UserMongoSchema.virtual('connectionStatus', {
ref: 'UserConnection',
localField: '_id',
foreignField: 'userConnection',
justOne: true
});
并根据结果填充它们
...
.exec((errAgg, results) => {
User.populate(results[0].data, [
{ path: 'userConnectionStatus', match: { userConnection: req.userCode }, select: 'userConnectionStatus' },
{ path: 'connectionStatus', match: { user: req.userCode }, select: 'userConnectionStatus' },
], (errPop, populateResponse) => {
if (errPop) { return next(errPop); }
populateResponse = populateResponse.map((row) => {
row['userConnectionStatus'] = row.userConnectionStatus ? row.userConnectionStatus.userConnectionStatus : null;
row['connectionStatus'] = row.connectionStatus ? row.connectionStatus.userConnectionStatus : null;
return row;
});
...
查看操作顺序,我认为这不会影响性能,因为我仅在匹配的前 X(最大 100)结果上运行填充。
我不会将此标记为答案。如果您对这是否是不好的做法或是否有更好的方法有任何意见,请随时发表评论。
推荐阅读
- macos - 没有管理员权限的 AppleScript,我如何获得用户打开 App 的首选时间?
- python-3.x - Odoo 如何获取每个字段中的值 id
- python - 使用列条件处理数据框的子集
- arm - 使用 STM32 和 HAL 将 DWT 周期计数转换为时间
- node.js - 如何在没有管理员权限窗口的情况下运行 node.js?
- python - 我可以告诉 Python 忽略文件的其余部分和/或退出而不引发异常,就好像到达文件末尾一样?
- mysql - MySQL 8.0.19 服务器安装失败
- java - 在android中进行回调的简单方法 - AndroidX
- function - 在 Lua 函数中指定数学环境
- r - R 清理数据 - 用于合并来自 2 个单独数据帧的紧密匹配项