Mongoose:在Mongoose文档中使用$addFields, $filter和$map深层嵌套数组



我有一个猫鼬模式,它的结构是这样的:

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]

我有一个名为的数组核准它有一些对象id。

我想过滤页面events.details同时保持其余字段的完整。

我想要的结果如下:

注意: *字段filteredPeople是我在过滤people后想要的数组与.

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的结果。

我可以尝试合并这两个数组。但我没有任何字段来匹配它们,因为第二个estatepeople数组将没有任何内容,只有过滤器的人。因此,我必须通过数组的索引和它们出现的位置来合并这两个数组。

有人可以帮助我,如何获得所需的文件与相对较好的性能?

对于有同样问题的人:最后,我找不到任何方法来以合理的性能执行我想要的查询。

这种模式设计并不是执行这种复杂查询的最佳方式。我最终做的是使细节数组成为一个对象,并为不同的细节提供单独的文档。然后我创建了一个父模式,它保留了对相同属性的详细信息的引用。

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

最新更新