使用代表用户的本地表:
{
_id: 'a',
name: 'One',
subscription_id: '1234'
}
表示用户订阅的外表:
{
_id: '1234',
plan: 'intro'
}
然后,您可以获得所有用户的数组,其订阅包含在子字段中:
db.users.aggregate([{
"$lookup": {
"from": "subscriptions",
"as": "subscriptions",
"let": {
"id": "$_id"
},
"pipeline": [{
"$match": {
"$expr": {
"$eq": ["$$id", "$subscription_id"]
}
}
}
]
}
},
{
"$addFields": {
"subscription": {
"$arrayElemAt": ["$subscriptions", 0]
}
}
}
])
结果数组中的每个元素都如下所示:
{
_id: 'a',
name: 'One',
subscription_id: 1234,
subscription: {
_id: 1234,
plan: 'intro'
}
}
现在,我想要使用这些选项对整个用户数组进行排序:
按名称和用户名(按字母顺序排列)是直截了当的,因为您可以按升序对这些字段进行排序。
{
$sort: {
name: 1,
username: 1,
subscription.plan: 1 // this wouldn't be logical, would it work at all?
}
}
但是,订阅计划并非如此直接。订阅计划不能按字母顺序排列,同时保持合理性,例如计划是“介绍”,“基本”,“独立”,“专业”或类似的东西。
有没有办法为这些元素提供逻辑排序顺序?聚合可以生成一个整数字段,具体按计划排序吗?