#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 поля с именем статус, и я не вижу вложенного, теперь хорошо , вы хотели изменить данные после размотки, основываясь на вложенном статусе, а не на статусе верхнего уровня, я думаю, что на этот раз все будет в порядке.