![](/img/trans.png)
[英]Using MongoDB $split operator on field in object nested in array in aggregation
[英]How to remove a field of an array's nested object that has an empty string value using mongodb aggregation?
到目前为止,在我尝试之后,我想出了解决方案,如果该对象具有空值字段,我可以删除数组内的整个对象。 这在我的情况下不起作用。 我只需要删除字段并保留对象的其余部分。 在这种情况下,“评论”字段是偶尔具有空值的字段。 提前致谢!
结构:
someArray [
{
field1:"value",
field2:"value",
Comment:""},
{
field1:"value",
field2:"value",
Comment:""}]
代码:
$project: {
someArray: {
$filter: {
input: "$someArray", as: "array",
cond: { $ne: [ "$$array.Comment", ""]}}}}
使用$map
遍历数组元素。对于每个comment不是空字符串的数组元素,返回整个元素,否则返回不包括注释字段的文档。 像这样:
db.collection.aggregate([
{
"$project": {
someArray: {
$map: {
input: "$someArray",
as: "element",
in: {
$cond: {
if: {
$eq: [
"",
"$$element.Comment"
]
},
then: {
field1: "$$element.field1",
field2: "$$element.field2"
},
else: "$$element"
}
}
}
}
}
},
])
这里是工作链接。
这是一个解决方案,其中数组的嵌套对象可以有多个字段,并且这些字段不需要在聚合中引用。 删除嵌套对象的字段,其值为空字符串 ( ""
):
db.collection.aggregate([
{
$set: {
someArray: {
$map: {
input: '$someArray',
as: 'e',
in: {
$let: {
vars: {
temp_var: {
$filter: {
input: { $objectToArray: '$$e' },
cond: { $ne: [ '', '$$this.v' ] },
}
}
},
in: {
$arrayToObject: '$$temp_var'
}
}
}
}
}
}
},
])
Charchit Kapoor 的解决方案仅在您的阵列完全具有
{
field1: ...
field2: ...
Comment:""
}
但它不适用于任意字段。 我正在寻找更通用的解决方案,我的第一个想法是:
db.collection.aggregate([
{
"$project": {
someArray: {
$map: {
input: "$someArray",
in: {
$cond: {
if: { $eq: ["$$this.Comment", ""] },
then: { $mergeObjects: ["$$this", { Comment: "$$REMOVE" }] },
else: "$$this"
}
}
}
}
}
}
])
但它不起作用。
我结束了这个:
db.collection.aggregate([
{
"$project": {
someArray: {
$map: {
input: "$someArray",
in: {
$cond: {
if: { $eq: ["", "$$this.Comment"] },
then: {
$arrayToObject: {
$filter: {
input: {
$map: {
input: { $objectToArray: "$$this" },
as: "element",
in: { $cond: [{ $eq: ["$$element.k", "Comment"] }, null, "$$element"] }
}
},
as: "filter",
cond: "$$filter" // removes null's from array
}
}
},
else: "$$this"
}
}
}
}
}
}
])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.