我正在使用 Mongoose 开发 MongoDB 项目,并且在查询路由文档时遇到了挑战。每个路线文档都有这样的结构:
const locationSchema = new mongoose.Schema({
name: { type: String, required: true },
precedence: { type: Number, required: true },
});
const routeSchema = new mongoose.Schema({
name: { type: String, required: true },
locations: [{ type: locationSchema, required: true }],
});
位置数组包含带有字段名称和优先级的子文档。
这里的优先级代表 - 如果一条路线的位置 A、B、C 的优先级分别为 1、2、3,则表示将首先覆盖位置 A,然后是 B,最后是 C。
现在,我需要检索从位置 A 到位置 B 的所有路由,其中位置 A 的优先级小于位置 B 的优先级。
如果这是数据:
[
{
"name": "routeA",
"locations":[
{
"name":"A",
"precedence":1
},
{
"name":"B",
"precedence":2
},
{
"name":"C",
"precedence":3
}
]
},
{
"name": "routeB",
"locations":[
{
"name":"A",
"precedence":2
},
{
"name":"B",
"precedence":1
},
{
"name":"C",
"precedence":3
}
]
}
]
我应该只选择路线A。
我尝试使用聚合,但没有得到所需的结果。
一个选项是:
$filter
和 $sortArray
仅添加 A
和 B
的新临时数组,其中 A
如果存在则为第一个。$match
仅记录第一个 precedence
较小的地方db.collection.aggregate([
{$addFields: {route: {
$sortArray: {
input: {$filter: {
input: "$locations",
cond: {$in: ["$$this.name", ["A", "B"]]}
}},
sortBy: {name: 1}
}
}}},
{$match: {$expr: {
$lt: [{$first: "$route.precedence"}, {$last: "$route.precedence"}]
}}},
{$unset: "route"}
])
查看它在 playground 示例中的工作原理