выберите внутри элемента, который может быть массивом или строкой в ​​rethinkdb

Мой json в базе данных rethinkdb выглядит следующим образом (в качестве примера я привел 4 документа):

    {
        "label": {
            "id": 59,
            "country": "Germany",
            "formats": {
                "format": {
                    "text": "",
                    "name": "CD",
                    "qty": 1,
                    "descriptions": {
                        "description": [
                            "Album",
                            "Limited Edition"
                        ]
                    }
                }
            }
        }
    }


    {
        "label": {
            "id": 60,
            "country": "US",
            "formats": {
                "format": {
                    "text": "",
                    "name": "CD",
                    "qty": 1,
                    "descriptions": {
                        "description": "Album"
                    }
                }
            }
        }
    }

    {
        "label": {
            "formats": {
                "format": {
                    "text": "",
                    "name": "Vinyl",
                    "qty": 1,
                    "descriptions": {
                        "description": [
                            "12\"",
                            "33 ⅓ RPM"
                        ]
                    }
                }
            },
            "country": "US",
            "id": 42
        }
    }
{
    "label": {
        "formats": {
            "format": {
                "text": "",
                "name": "Vinyl",
                "qty": 1,
                "descriptions": {
                    "description": "12\""
                }
            }
        },
        "country": "US",
        "id": 10
    }
}

Я хотел бы отфильтровать те ярлыки, которые являются альбомами. Тег описания содержит эту информацию. Однако этот элемент иногда является массивом, иногда строкой. Мне нужны те ярлыки, которые содержат значение «Альбом» независимо от типа данных. Пока я могу получить только те значения, где «описание» является строкой. Это код, который я могу использовать до сих пор:

r.table("labels")('label').filter(r.row("formats")("format")("descriptions")("description").eq("Album"))('id')

Есть ли способ получить даже те значения идентификатора, где альбом также существует в массиве? заранее спасибо


person Community    schedule 17.06.2015    source источник


Ответы (1)


Я бы рекомендовал изменить формат данных, чтобы description всегда был массивом, даже если в этом массиве есть только один элемент. Если вы это сделаете, то этот запрос работает:

r.table('labels')('label').filter(function(row) {
  return row("formats")("format")("descriptions")("description").contains('Album');
})

Если вы не хотите этого делать, вы можете сделать это:

r.table('labels')('label').filter(function(row) {
  return row("formats")("format")("descriptions")("description").do(function(desc) {
    return r.branch(desc.typeOf().eq('ARRAY'), desc.contains('Album'), desc.eq('Album'));
  });
})
person mlucy    schedule 17.06.2015
comment
Спасибо. Это работает. Если я изменю формат данных, а затем проиндексирую его, смогу ли я использовать содержимое в этом индексе? - person ; 17.06.2015
comment
В этом случае вам понадобится мультииндекс: rethinkdb.com/docs/ вторичные-индексы/javascript/#мульти-индексы - person mlucy; 17.06.2015