MongoDB $unset 如果满足条件

Pat*_*ira 1 json mongodb unset spring-data-jpa aggregation-framework

有人可以帮我解决这种情况吗?

我有这个假 JSON...

[
  {
    "user": {
      "type": "PF",
      "code": 12345,
      "Name": "Darth Vader",
      "currency": "BRL",
      "status": "ACTIVE",
      "localization": "NABOO",
      "createDate": 1627990848665,
      "olderAdress": [
        {
          "localization": "DEATH STAR",
          "status": "BLOCKED",
          "createDate": 1627990848665
        },
        {
          "localization": "TATOOINE",
          "status": "CANCELLED",
          "createDate": 1627990555665
        },
        {
          "localization": "ALDERAAN",
          "status": "INACTIVED",
          "createDate": 1627990555665
        },
        
      ]
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

code如果状态等于“已阻止”或“已取消”,我想删除该字段。我使用聚合是因为我在实际示例之前做了很多事情。我怎样才能做到这一点??

我需要这个结果:

[
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "user": {
      "Name": "Darth Vader",
      "createDate": 1.627990848665e+12,
      "currency": "BRL",
      "localization": "DEATH STAR",
      "status": "BLOCKED",
      "type": "PF"
    }
  },
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "user": {
      "Name": "Darth Vader",
      "createDate": 1.627990555665e+12,
      "currency": "BRL",
      "localization": "TATOOINE",
      "status": "CANCELLED",
      "type": "PF"
    }
  },
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "user": {
      "Name": "Darth Vader",
      "code": 12345,
      "createDate": 1.627990555665e+12,
      "currency": "BRL",
      "localization": "ALDERAAN",
      "status": "INACTIVED",
      "type": "PF"
    }
  },
  {
    "_id": ObjectId("5a934e000102030405000000"),
    "user": {
      "Name": "Darth Vader",
      "code": 12345,
      "createDate": ISODate("2021-09-16T17:36:26.405Z"),
      "currency": "BRL",
      "localization": "NABOO",
      "status": "ACTIVE",
      "type": "PF"
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

Soo...与名称无关,我将检查状态,如果您考虑到这种情况,我将删除该字段code

Tak*_*kis 6

询问

  • $$REMOVE如果某个字段获取该值,则使用系统变量并将其删除
  • 所以条件是,如果不是,user.code则保留旧值,否则该字段"BLOCKED""CANCELLED""$$REMOVE"

测试代码在这里

db.collection.aggregate([
  {
    "$set": {
      "user.code": {
        "$cond": [
          {
            "$in": [
              "$user.status",
              [
                "BLOCKED",
                "CANCELLED"
              ]
            ]
          },
          "$$REMOVE",
          "$user.code"
        ]
      }
    }
  }
])
Run Code Online (Sandbox Code Playgroud)

编辑

上面的代码检查user.status但你想删除代码或不基于user.olderAdress.status(展开后)(其2个字段具有相同的名称状态)

查询(在您已有的阶段之后添加此查询)

测试代码

{
    "$set": {
      "user.code": {
        "$cond": [
          {
            "$in": [
              "$user.status",
              [
                "BLOCKED",
                "CANCELLED"
              ]
            ]
          },
          "$$REMOVE",
          "$user.code"
        ]
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)