Node.js 如何使用$filter从嵌套数组中检索结果?
我试图使用MongoDB构建一个查询,但是遇到了一个问题,我无法在数组中过滤数组 在下面的示例中,我试图检索父Node.js 如何使用$filter从嵌套数组中检索结果?,node.js,mongodb,aggregation-framework,Node.js,Mongodb,Aggregation Framework,我试图使用MongoDB构建一个查询,但是遇到了一个问题,我无法在数组中过滤数组 在下面的示例中,我试图检索父列表数组中的子数据数组中的元素,其中键systemDelete\u DT为null 我尝试使用$eq:[“$$s\u lists.customData.systemDelete\u DT”,null]作为筛选条件,但是没有加载结果 我使用的是$filter,因为这是带有$lookup的较大聚合的一部分 如何仅从数据数组中检索结果,其中键systemDelete\u DT为null 我的
列表数组中的子数据数组中的元素,其中键systemDelete\u DT
为null
我尝试使用$eq:[“$$s\u lists.customData.systemDelete\u DT”,null]
作为筛选条件,但是没有加载结果
我使用的是$filter
,因为这是带有$lookup
的较大聚合的一部分
如何仅从数据
数组中检索结果,其中键systemDelete\u DT
为null
我的查询
db.collection.aggregate([
{
$lookup: {
from: "s_list",
localField: "_id",
foreignField: "_id",
as: "s_lists"
}
},
{
$project: {
list: {
$filter: {
input: {
$arrayElemAt: [
"$s_lists.list",
0
]
},
as: "s_lists",
cond: {
**// Note: This condition works as expected**
$eq: [
"$$s_lists.systemDelete_DT",
null
],
}
}
}
}
}
])
预期结果:
[
{
"_id": ObjectId("6099619baa04f15c3fb67a83"),
"list": [
{
"_id": ObjectId("609e70be503c58506ca77d3d"),
"data": [
{
"_id": ObjectId("609e70be503c58506ca77d41"),
"field_id": ObjectId("609c00d6de4c601e4fa358d8"),
"systemDelete_DT": null
},
{
"_id": ObjectId("609e936024c6a45adc030a4c"),
"field_id": ObjectId("609e936024c6a45adc030a4b"),
"systemDelete_DT": null
}
],
"systemDelete_DT": null
}
]
}
]
数据库示例:
db={
"collection": [
{
"_id": ObjectId("6099619baa04f15c3fb67a83")
}
],
"s_list": [
{
"_id": ObjectId("6099619baa04f15c3fb67a83"),
"systemDelete_DT": null,
"list": [
{
"_id": ObjectId("609e6ee1955f7b4fbd73fcb5"),
"systemDelete_DT": "2021-05-14T18:13:18+01:00",
"data": [
{
"_id": ObjectId("609e6ee1955f7b4fbd73fcb6"),
"systemDelete_DT": "2021-05-14T18:13:18+01:00",
"field_id": ObjectId("609bbeb0f1033c156f8e4d86"),
},
{
"_id": ObjectId("609e6ee1955f7b4fbd73fcb9"),
"systemDelete_DT": null,
"field_id": ObjectId("609c00d6de4c601e4fa358d8"),
},
{
"_id": ObjectId("609e936024c6a45adc030a4c"),
"systemDelete_DT": null,
"field_id": ObjectId("609e936024c6a45adc030a4b"),
}
]
},
{
"_id": ObjectId("609e70be503c58506ca77d3d"),
"systemDelete_DT": null,
"data": [
{
"_id": ObjectId("609e70be503c58506ca77d3e"),
"systemDelete_DT": "2021-05-14T18:13:18+01:00",
"field_id": ObjectId("609bbeb0f1033c156f8e4d86"),
},
{
"_id": ObjectId("609e70be503c58506ca77d41"),
"systemDelete_DT": null,
"field_id": ObjectId("609c00d6de4c601e4fa358d8"),
},
{
"_id": ObjectId("609e936024c6a45adc030a4c"),
"systemDelete_DT": null,
"field_id": ObjectId("609e936024c6a45adc030a4b"),
}
]
}
]
}
]
}
$filter
迭代s_列表的循环。使用$arrayElemAt
$map
迭代上述过滤列表结果的循环
$filter
迭代内部数据的循环
数组和过滤器空元素
$mergeObjects
将当前字段与上面过滤器中更新的数据
字段合并
{
$project: {
list: {
$map: {
input: {
$filter: {
input: { $arrayElemAt: ["$s_lists.list", 0] },
cond: { $eq: ["$$this.systemDelete_DT", null] }
}
},
in: {
$mergeObjects: [
"$$this",
{
data: {
$filter: {
input: "$$this.data",
cond: { $eq: ["$$this.systemDelete_DT", null] }
}
}
}
]
}
}
}
}
}