在rethinkdb

时间:2015-06-17 00:40:23

标签: rethinkdb reql

我在rethinkdb数据库中的json如下(我以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
    }
}

我想过滤那些专辑的标签。 description标记包含此信息。但是,此元素有时是一个数组,有时是一个字符串。我需要那些包含价值"专辑"无论数据类型如何。到目前为止,我只能得到那些"描述"是一个字符串。这是我到目前为止可以使用的代码:

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

有没有办法获得Album存在于数组中的那些id值?提前致谢

1 个答案:

答案 0 :(得分:0)

我建议更改您的数据格式,以便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'));
  });
})