MongoDB/Mongoose 查询:检索从位置 A 到位置 B 的具有优先级约束的路由

问题描述 投票:0回答:1

我正在使用 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。

我尝试使用聚合,但没有得到所需的结果。

mongodb mongoose mongodb-query aggregation-framework
1个回答
0
投票

一个选项是:

  1. 使用
    $filter
    $sortArray
    仅添加
    A
    B
    的新临时数组,其中
    A
    如果存在则为第一个。
  2. $match
    仅记录第一个
    precedence
    较小的地方
  3. 格式
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 示例中的工作原理

© www.soinside.com 2019 - 2024. All rights reserved.