【问题标题】:Mongoose: Using $addFields, $filter and $map inside deeply nested array in mongoose documentMongoose:在 mongoose 文档的深度嵌套数组中使用 $addFields、$filter 和 $map
【发布时间】:2021-04-29 05:23:12
【问题描述】:

我有一个结构如下的猫鼬模式:

Schema E = {
    _id,
    ... some fields,
    details: [
       {
          ...somefields,
          people: [ObjectIds] 
       }
    ]
}

首先,我有一个聚合查询,我使用的是 $geoNear,然后是 $match,然后是 $facet。 操作后我得到的文件如下:

estates: [
    {
       _id,
       ... some fields,
       details: [
          {
             ...somefields,
             people: [ObjectIds]
          }
       ],
       ... other fields
    },
    ... more estate objects
]
],
page: [...some objects]

我有一个名为 approved 的数组,其中包含一些对象 ID。

我想过滤 events.details 中的 page 数组,同时保持其余字段不变。

我想要的结果如下:

注意:*字段 filteredPeople 是我在过滤 people 和 approved 后想要的数组。 p>

estate: [
    {
       _id,
       ... some fields,
       details: [
          {
             ...somefields,
             filteredPeople: [ObjectIds],
             numberOfPeople: Size of people array

          }
       ],
       ... other fields
    },
    ... more estate objectes
],
page: [...some objects]

这是我尝试做的:

{
  "estates": {
  "$map": {
    "input": "$estates",
    "as": "estate",
    "in": {
      "details": {
        "$map": {
          "input": "$$estate.details",
          "as": "detail",
          "in": {
            "filteredPeople": {
              "$filter": {
                "input": "$$detail.people",
                "as": "people",
                "cond": { "$in": ["$$people", approved] }
              }
            }
          }
        }
      }
    }
  }
  },
}

但这会删除其他字段。另一种方法是创建一个名为 EstatePeople 的单独字段,其中将存储 $addFields 的结果。

然后我可以尝试合并这两个数组。但是我没有任何字段可以匹配它们,因为第二个 EstatePoeple 数组除了被过滤的人之外什么都没有。所以我将不得不通过数组的索引和它们出现的位置来合并这两个数组。

有人可以帮助我了解如何获得性能相对较好的所需文档吗?

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    对于遇到相同问题的任何人: 最后,我无法找到任何方法来执行我想要的查询并具有合理的性能。

    这种模式设计并不是执行这种复杂查询的最佳方式。我最终做的是将详细信息数组设为对象,并为单独的详细信息提供单独的文档。然后我制作了一个父模式,它保留了同一庄园的详细信息。

    您可以根据要执行的查询使用反向引用或引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-29
      • 2021-04-17
      • 2014-01-29
      • 2012-04-14
      • 1970-01-01
      • 2016-10-06
      • 2018-12-13
      • 2020-03-28
      相关资源
      最近更新 更多