gpt4 book ai didi

node.js - Mongoose -如何对人口进行多标准排序

转载 作者:太空宇宙 更新时间:2023-11-04 00:19:43 25 4
gpt4 key购买 nike

我试图对填充有“group.name”的“角色”文档进行排序,首先在 group.name 上,然后在 role.name 上

return this.find(query, { _group: 1, name: 1, _id:0 } )
.populate('_group', 'name -_id')
.sort({ '_group.name': 1, name: 1 })

但它没有按预期工作,我仅根据 role.name 进行排序

ROLES:[
{"name":"NewRole"},
{"name":"NewRoleInGroup","_group":{"name":"GroupA"}},
{"_group":{"name":"GroupA"},"name":"admin"},
{"_group":{"name":"GroupA"},"name":"employee"},
{"_group":{"name":"GroupB"},"name":"employee"},
{"_group":{"name":"GroupC"},"name":"employee"},
{"_group":{"name":"GroupA"},"name":"manager"},
{"_group":{"name":"GroupB"},"name":"manager"},
{"name":"visitor"}
]

我想要的是:

ROLES:[
// NO GROUP
{"name":"NewRole"},
{"name":"visitor"}.
// GroupA
{"_group":{"name":"GroupA"},"name":"admin"},
{"_group":{"name":"GroupA"},"name":"employee"},
{"_group":{"name":"GroupA"},"name":"manager"},
{"name":"NewRoleInGroup","_group":{"name":"GroupA"}},
// GroupB
{"_group":{"name":"GroupB"},"name":"employee"},
{"_group":{"name":"GroupB"},"name":"manager"},
// GroupC
{"_group":{"name":"GroupC"},"name":"employee"}
]

感谢反馈

更新根据@Talha 评论:

使用聚合,我接近我需要的...但是,我在数组内获取组数据,在多对一关系中,在这种情况下只有一个组...如何投影group 作为数组中的第一个对象: "group": {} 或 "group": {"name"; ...,“描述”:...}?

  return this.aggregate([
{ $match: query},
{
$lookup: {
from: 'groups',
localField: '_group',
foreignField: '_id',
as: 'group'
}
}
,
{
$project: {
'group.name': 1,
'group.description': 1,
name: 1,
description: 1,
_id: 0
}
},
{ $sort: { 'name': 1 } },
{ $limit: limit },
{ $skip: skip }
])


ROLES: [
// NO GROUP
{"name":"NewRole","description":"NewRole description","group":[]},
{"name":"Visitor","description":"no permissions","group":[]},
// GROUP A
{"name":"NewRoleInGroup","description":"NewRoleInGroup description","group":[{"name":"GroupA","description":"Description GroupA"}]},
{"name":"admin","description":"can RW group, user","group":[{"name":"GroupA","description":"Description GroupA"}]},
{"name":"employee","description":"can R group, can read user","group":[{"name":"GroupA","description":"Description GroupA"}]},
{"name":"manager","description":"can R group, can RW user","group":[{"name":"GroupA","description":"Description GroupA"}]},
// GROUP B
{"name":"employee","description":"can R group, can read user","group":[{"name":"GroupB","description":"Description GroupB"}]},
{"name":"manager","description":"can R group, can RW user","group":[{"name":"GroupB","description":"Description GroupB"}]},
// GROUP C
{"name":"employee","description":"can R group, can read user","group":[{"name":"GroupC","description":"Description GroupC"}]}]

最佳答案

我应该使用以下函数 w 聚合:

  return this.aggregate([
{ $match: query},
{
$lookup: {
from: 'groups',
localField: '_group',
foreignField: '_id',
as: 'group'
}
},
{
$project: {
group: {
$let:{
vars:{
firstGroup:{
$arrayElemAt:["$group",0]
}
},
in:{
name:"$$firstGroup.name",
description:"$$firstGroup.description"
}
}
},
name: 1,
description: 1,
_id: 0
}
},
{ $sort: { 'group.name': 1, 'name': 1 } },
{ $limit: limit },
{ $skip: skip }
])
.exec()
.then((list) => {
return list;
})

这将输出正确排序的列表( 1/by group.name 2/ny role.name ),其中组不在查找输出数组中:

ROLES: [
// NO GROUP
{"name":"NewRole","description":"NewRole description","group":{}},
{"name":"Visitor","description":"no permissions","group":{}},
// GROUP A
{"name":"NewRoleInGroup","description":"NewRoleInGroup description","group":{"name":"GroupA","description":"Description GroupA"}},
{"name":"admin","description":"can RW group, user","group":{"name":"GroupA","description":"Description GroupA"}},
{"name":"employee","description":"can R group, can read user","group":{"name":"GroupA","description":"Description GroupA"}},
{"name":"manager","description":"can R group, can RW user","group":{"name":"GroupA","description":"Description GroupA"}},
// GROUP B
{"name":"employee","description":"can R group, can read user","group":{"name":"GroupB","description":"Description GroupB"}},
{"name":"manager","description":"can R group, can RW user","group":{"name":"GroupB","description":"Description GroupB"}},
// GROUP C
{"name":"employee","description":"can R group, can read user","group":{"name":"GroupC","description":"Description GroupC"}}]

关于node.js - Mongoose -如何对人口进行多标准排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44880859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com