Javascript 从不同集合Mongoose返回字段
设想一个函数,它根据用户的姓名查找用户并返回用户Javascript 从不同集合Mongoose返回字段,javascript,node.js,mongodb,mongoose,nodes,Javascript,Node.js,Mongodb,Mongoose,Nodes,设想一个函数,它根据用户的姓名查找用户并返回用户 User.aggregate( [ { $sort: { userFirstName: 1, userLastName: 1 } }, { $addFields: { firstLastName: { $concat: ['$userFirstName', ' ', '$userLastName'] },
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']
}
}
例如用户:我,用户连接:“某人”,用户连接状态:“跟踪”
我要做的是再返回两个字段,
1.我的用户与他保持联系
2.他的用户与我的连接状态
并且不返回阻止我的用户。
对于这种数据库结构,最好的方法是什么
感谢您抽出时间通过选择所有被阻止的用户,并在聚合内的匹配中添加$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;
});
...
从操作顺序来看,我认为这不会影响性能,因为我只在那些匹配的top X(最大100)结果上运行“填充”
我现在还不会把这个标记为答案。如果您对这种做法是否不好或是否有更好的做法有任何意见,请随时发表评论。使用mongodb的$lookup聚合查询@VikashSingh我理解它的可能性,但是在我的$group或last$project之后是否有可能进行$lookup,所以这样它将只填充那些被切片和匹配的。我无法从那里$unwind data和$lookup。或者我这样想是不对的,忽略操作顺序,在匹配和切片之前运行$lookup