MongoDB $сбросить, если условие выполнено

#json #mongodb #spring-data-jpa #aggregation-framework #unset

Вопрос:

Кто-нибудь, пожалуйста, помогите мне с этой ситуацией?

У меня есть этот поддельный 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
        },
        
      ]
    }
  }
]
 

Я хотел бы удалить поле code , если статус равен «ЗАБЛОКИРОВАН» или «ОТМЕНЕН». Я использую aggregate, потому что я делаю много вещей перед Практическим примером. Как я могу это сделать??

Мне нужен этот результат:

 [
  {
    "_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"
    }
  }
]
 

Су…Независимо от имени, я проверю статус, и если вы подумаете об этом условии, я удалю поле code .

Ответ №1:

Запрос

  • использует системную переменную $$REMOVE , если поле получает это значение, оно удаляется
  • таким образом , условие состоит user.code в том, чтобы сохранить старое значение , если нет "BLOCKED" "CANCELLED" , иначе "$$REMOVE" поле

Тестовый код здесь

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

Редактировать

Приведенный выше код проверяет user.status , хотите ли вы удалить код или нет, на основе user.olderAdress.status (после размотки) (его 2 поля с одинаковым статусом имени)

Запрос (добавьте это после этапов, которые у вас уже есть)

Тестовый код

 {
    "$set": {
      "user.code": {
        "$cond": [
          {
            "$in": [
              "$user.status",
              [
                "BLOCKED",
                "CANCELLED"
              ]
            ]
          },
          "$REMOVE",
          "$user.code"
        ]
      }
    }
  }
 

Комментарии:

1. Частично все в порядке… проблема в том… как я писал ранее, у меня есть другие пиперлайны ( mongoplayground.net/p/QehOjXOEpbz ) Я не уверен, в какой момент я представляю этот набор$…

2. похоже, вы можете добавить его сначала в сочетании с $addfields уже имеющимися, set=addfields, см. Это

3. Но если вы приведете этот пример так, как вы мне прислали… Вы можете видеть, что «код» был удален из каждого регистра… не только условного…

4. да, но этого не ожидается? «Имя»: «Дарт Вейдер» имел статус : «ЗАБЛОКИРОВАН» , поэтому во всех его адресах не будет поля кода. смотрите это у пользователя Darth Vader2 все еще есть свой код, потому что у него был статус «АКТИВНЫЙ».

5. в нем было 2 поля с именем статус, и я не вижу вложенного, теперь хорошо , вы хотели изменить данные после размотки, основываясь на вложенном статусе, а не на статусе верхнего уровня, я думаю, что на этот раз все будет в порядке.