Java - фильтрация массива объектов JSON по нескольким свойствам - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть объект, хранящийся в Cloudant, например:

{
  "attr1": "value",
  "Objects": [{
      "code": "v1",
      "allowNull": "true",
      "country": "BE"
    },
    {
      "code": "v2",
      "allowNull": "false",
      "country": "EG"
    }
  ]
}

И я хочу выполнить критерии фильтрации по коду / стране, чтобы на выходе был только один объект из списка объектов.

Есть ли способ сделать это со стороны Cloudant?Или эффективный способ сделать это на стороне Java?

1 Ответ

0 голосов
/ 25 февраля 2019

Вы можете достичь этого с помощью представления карты в Cloudant.Попробуйте что-то вроде этого:

function(doc) {
    if (doc && doc.Objects) {
        doc.Objects.forEach(function(obj) {
            emit([obj.code, obj.country], obj);
        });
    }
}

Это приведет к тому, что все элементы из списка Objects будут добавлены в индекс с ключом с векторным значением [code, country].

curl -s -XPOST -H "content-type:application/json" 'https://skruger.cloudant.com/demo/_design/query/_view/by_code_country?reduce=false' -d '{ "keys": [["v1","BE"]] }'
{"total_rows":2,"offset":0,"rows":[
    {"id":"1c593a931bcd7f0052ed8f9184810fd9","key":["v1","BE"],"value": 
        {"code":"v1","allowNull":"true","country":"BE"}}
]}

Вы можете делать запросы только по коду, используя подстановочный знак {}, например,

curl -g 'https://skruger.cloudant.com/demo/_design/query/_view/by_code_country?reduce=false&startkey=["v1"]&endkey=["v1",{}]'
{"total_rows":2,"offset":0,"rows":[
    {"id":"1c593a931bcd7f0052ed8f9184810fd9","key":["v1","BE"],"value": 
    {"code":"v1","allowNull":"true","country":"BE"}}
]}
...