Mongodb 基于使用$nin条件的字段从数组中筛选元素
我有一个mongo文档,如下所示Mongodb 基于使用$nin条件的字段从数组中筛选元素,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我有一个mongo文档,如下所示 { "_id": "123", "name": "ABC", "elements": { "_id": "123", "minorElements": [ [ { "id": "xyz1", "name": "xyz1" }, {
{
"_id": "123",
"name": "ABC",
"elements": {
"_id": "123",
"minorElements": [
[
{
"id": "xyz1",
"name": "xyz1"
}, {
"id": "xyz2",
"name": "xyz2"
}, {
"id": "xyz3",
"name": "xyz3"
}
],
[
{
"id": "xyz1",
"name": "xyz1"
}, {
"id": "xyz3",
"name": "xyz3"
}, {
"id": "xyz5",
"name": "xyz5"
}
]
]
}
}
“elements.minorrelations”是数组的数组
如何编写mongo聚合以从“elements.minorerelations”中删除对象,其中“id”不在“xyz1”和“xyz2”中
预期产出:
{
"_id": "123",
"name": "ABC",
"elements": {
"_id": "123",
"minorElements": [
[{
"id": "xyz1",
"name": "xyz1"
}, {
"id": "xyz2",
"name": "xyz2"
}
],
[{
"id": "xyz1",
"name": "xyz1"
}
]
]
}
}
外部阵列和内部阵列所需的示例有效负载:
db.collection.aggregate([
{
$addFields: {
"elements.minorElements": {
$map: {
input: "$elements.minorElements",
as: "me",
in: {
$filter: {
input: "$$me",
cond: {
$in: [ "$$this.id", [ "xyz1", "xyz2" ] ]
}
}
}
}
}
}
}
])
需要注意的两点:
首先,
从“elements.MinoRelations”中删除对象,其中“id”不在“xyz1”和“xyz2”中
=>只是意味着您需要保留(项目)元素,其中id为“xyz1”或“xyz2”(或[“xyz1”、“xyz2”]中的id)
第二,
正如您所注意到的,“elements.minorrelations”是一个数组的数组。因此,当您应用$filter操作符时,您尝试将其应用到数组上
技巧是对数组的第一级应用$map操作符,然后对$map的每个元素应用$fiter操作符
问题是:
db.collection.aggregate([
{
"$project": {
"elements.minorElements": {
"$map": {
"input": "$elements.minorElements",
"as": "item",
"in": {
$filter: {
input: "$$item",
as: "subItem",
cond: {
$in: [
"$$subItem.id",
[
"xyz1",
"xyz2"
]
]
}
}
},
}
}
}
}
])