仅当值存在聚合时才创建集合 mongodb
Create a Set only if value exists aggregate mongodb
我有一个数据集:
[
{
"_id": 1,
"Data": {
"a": {
"levela": {
"fname": "fname",
"lname": "lname"
},
"levelfacility": []
}
}
},
{
"_id": 2,
"Data": {
"a": {
"levela": {},
"levelfacility": [
{
"facility": "facility"
}
]
}
}
},
{
"_id": 3,
"Data": {
"a": {
"levela": {},
"levelfacility": []
}
}
}
]
我想仅在值存在时才将大写字母应用于值,但是当我应用 $set 时,如果它不存在则它只是一个空字符串。
[
{
"_id": 1,
"Data": {
"a": {
"levela": {
"fname": "fname",
"fnameNORM": "FNAME",
"lname": "lname"
},
"levelfacility": []
}
}
},
{
"_id": 2,
"Data": {
"a": {
"levela": {},
"levelfacility": [
{
"facility": "facility",
"facilityNORM": "FACILITY"
}
]
}
}
},
{
"_id": 2,
"Data": {
"a": {
"levela": {},
"levelfacility": []
}
}
}
]
我想应用 $conditional 这样的东西,这样我就不会留下原始字段不存在的新字段
我试过这个字符串
{
$set: {
"Data.a.levela.fnameNORM": {
$cond: {
if: {
"$Data.a.levela.fname": {
$exist: true
}
},
then: {
$toUpper: "$Data.a.levela.fname"
},
else: "$$REMOVE"
}
}
}
}
我已经为数组试过了
{
$set: {
"Data.a.levelfacility": {
$map: {
input: "$Data.a.levelfacility",
in: {
$mergeObjects: [
"$$this",
{
"facilityNORM": {
$cond: {
if: {
"$$this.FacilityName": {
$exist: true
}
},
then: {
$toUpper: "$$this.FacilityName"
},
else: "$$REMOVE"
}
}
}
]
}
}
}
}
}
你实际上是在正确的轨道上。只需使用 $map
来处理 levelfacility
数组。
db.collection.aggregate([
{
"$addFields": {
"Data.a.levela": {
"$cond": {
"if": {
$ne: [
{
"$ifNull": [
"$Data.a.levela.fname",
null
]
},
null
]
},
"then": {
"fname": "$Data.a.levela.fname",
"fnameNORM": {
"$toUpper": "$Data.a.levela.fname"
}
},
"else": "$Data.a.levela"
}
}
}
},
{
"$addFields": {
"Data.a.levelfacility": {
"$map": {
"input": "$Data.a.levelfacility",
"as": "lf",
"in": {
"$cond": {
"if": {
$ne: [
{
"$ifNull": [
"$$lf.facility",
null
]
},
null
]
},
"then": {
"facility": "$$lf.facility",
"facilityNORM": {
"$toUpper": "$$lf.facility"
}
},
"else": "$$lf"
}
}
}
}
}
}
])
这里是Mongo playground供大家参考。
我有一个数据集:
[
{
"_id": 1,
"Data": {
"a": {
"levela": {
"fname": "fname",
"lname": "lname"
},
"levelfacility": []
}
}
},
{
"_id": 2,
"Data": {
"a": {
"levela": {},
"levelfacility": [
{
"facility": "facility"
}
]
}
}
},
{
"_id": 3,
"Data": {
"a": {
"levela": {},
"levelfacility": []
}
}
}
]
我想仅在值存在时才将大写字母应用于值,但是当我应用 $set 时,如果它不存在则它只是一个空字符串。
[
{
"_id": 1,
"Data": {
"a": {
"levela": {
"fname": "fname",
"fnameNORM": "FNAME",
"lname": "lname"
},
"levelfacility": []
}
}
},
{
"_id": 2,
"Data": {
"a": {
"levela": {},
"levelfacility": [
{
"facility": "facility",
"facilityNORM": "FACILITY"
}
]
}
}
},
{
"_id": 2,
"Data": {
"a": {
"levela": {},
"levelfacility": []
}
}
}
]
我想应用 $conditional 这样的东西,这样我就不会留下原始字段不存在的新字段
我试过这个字符串
{
$set: {
"Data.a.levela.fnameNORM": {
$cond: {
if: {
"$Data.a.levela.fname": {
$exist: true
}
},
then: {
$toUpper: "$Data.a.levela.fname"
},
else: "$$REMOVE"
}
}
}
}
我已经为数组试过了
{
$set: {
"Data.a.levelfacility": {
$map: {
input: "$Data.a.levelfacility",
in: {
$mergeObjects: [
"$$this",
{
"facilityNORM": {
$cond: {
if: {
"$$this.FacilityName": {
$exist: true
}
},
then: {
$toUpper: "$$this.FacilityName"
},
else: "$$REMOVE"
}
}
}
]
}
}
}
}
}
你实际上是在正确的轨道上。只需使用 $map
来处理 levelfacility
数组。
db.collection.aggregate([
{
"$addFields": {
"Data.a.levela": {
"$cond": {
"if": {
$ne: [
{
"$ifNull": [
"$Data.a.levela.fname",
null
]
},
null
]
},
"then": {
"fname": "$Data.a.levela.fname",
"fnameNORM": {
"$toUpper": "$Data.a.levela.fname"
}
},
"else": "$Data.a.levela"
}
}
}
},
{
"$addFields": {
"Data.a.levelfacility": {
"$map": {
"input": "$Data.a.levelfacility",
"as": "lf",
"in": {
"$cond": {
"if": {
$ne: [
{
"$ifNull": [
"$$lf.facility",
null
]
},
null
]
},
"then": {
"facility": "$$lf.facility",
"facilityNORM": {
"$toUpper": "$$lf.facility"
}
},
"else": "$$lf"
}
}
}
}
}
}
])
这里是Mongo playground供大家参考。