Couchbase N1QL: обновить атрибут документа на основе другого атрибута - PullRequest
0 голосов
/ 06 сентября 2018

Я борюсь с update-for N1QL-запросом

мои документы выглядят так:

{
"invalidityReasons": {
    "AU": [
      "ANCESTOR_DEACTIVATED_OR_INVALID"
    ],
    "BE": [
      "ANCESTOR_DEACTIVATED_OR_INVALID"
    ],
    "BG": []
}
"metadata": {
  "configurations": {
    "AU": {
      "enabled": true,
    },
    "BE": {
      "enabled": false,
    },
    "BG": {
      "enabled": true,
    }
  }
}
}

что я пытаюсь сделать:

для всех стран, которые имеют недействительность Reason "ANCESTOR_DEACTIVATED_OR_INVALID" и активированы (то есть "enabled": true в metadata.configurations) => деактивировать эту страну (то есть "enabled": false)

в приведенном выше примере AU (Autralia) должен быть деактивирован

где я сейчас нахожусь

это значит в моей голове:

  • иди думал все страны
  • найти людей с недействительностьюReasons = ANCESTOR_DEACTIVATED_OR_INVALID + enable = true
  • обновление активации

так что update-for выглядел довольно неплохо, но мне не удалось заставить его работать:

update `data` t
SET  t.metadata.configurations.[country].enabled = false
FOR country IN OBJECT_NAMES(t.metadata.configurations)
    when t.metadata.configurations.[country].enabled = true
    and array_contains(t.invalidityReasons.[country], 'ANCESTOR_DEACTIVATED_OR_INVALID') end;

Couchbase объявляет о мутациях, но мои страны все еще активированы

Есть ли у вас какие-либо идеи:

  • , если это возможно даже с N1QL?
  • что я делаю не так? :)

кстати я использую Couchbase EE 5.1.1

спасибо, веселит,

Jules

1 Ответ

0 голосов
/ 06 сентября 2018

должно работать. Следующее работает правильно на одном документе.

insert into default values("11",{ "invalidityReasons": { "AU": [ "ANCESTOR_DEACTIVATED_OR_INVALID" ], "BE": [ "ANCESTOR_DEACTIVATED_OR_INVALID" ], "BG": [] }, "metadata": { "configurations": { "AU": { "enabled": true }, "BE": { "enabled": false }, "BG": { "enabled": true } } } } );
SELECT * FROM default USE KEYS "11";
update `default` t USE KEYS "11"
SET  t.metadata.configurations.[country].enabled = false
FOR country IN OBJECT_NAMES(t.metadata.configurations)
    when t.metadata.configurations.[country].enabled = true
    and array_contains(t.invalidityReasons.[country], 'ANCESTOR_DEACTIVATED_OR_INVALID') end;
SELECT * FROM default USE KEYS "11";
...