【问题标题】:Google Cloud DataStore: get all children of items by type at onceGoogle Cloud DataStore:一次按类型获取项目的所有子项
【发布时间】:2018-03-27 09:11:49
【问题描述】:

假设您在 Google Cloud DataStore 中存储了一个项目列表。每个项目都有一个子项目列表(功能列表)和子子项目(每个信息列表都有一个属性键列表)。

[
    {
        "key": "product_1234",
        "name": "Bio-Tofu",
        "features" : {
            "country": "Germany",
            "currency": "Euro"
        },
        "infos": {
            "info_A": {
                "attr_A": "key_A",
                "attr_B": "key_B",
                "attr_C": "key_C",
            },
            "info_B": {
                "attr_D": "key_D",
            }
        }
    },
    {
        "key": "product_6789",
        "name": "Bio-Soya-Dring",
        "features" : {
            "country": "Austria",
            "currency": "Euro"
        },
        "infos": {
            "info_A": {
                "attr_A": "key_A",
                "attr_E": "key_E",
            },
            "info_C": {
                "attr_F": "key_F",
            }
        }
    }
]

问题:有没有办法一次检索所有项目(产品)的所有“信息”或所有“属性-密钥”对?例如,我要检索的是:

{
    "attr_A": "key_A",
    "attr_B": "key_B",
    "attr_C": "key_C",
    "attr_D": "key_D",
    "attr_E": "key_E",
    "attr_F": "key_F",
}

或

infos: [
    "info_A",
    "info_B",
    "info_C"
]

我尝试这样做的原因是,我想创建一个 Pandas DataFrame(数据透视表),将信息或功能作为列,将项目作为行。我可以阅读所有项目并在 Python 代码中创建功能和信息列表,但也许有 SQL 方法可以要求 Google Cloud Storage 给我该列表(子集、联合或任何你命名的)?

感谢任何提示。

【问题讨论】:

  • 我会将这些庞大的实体拆分为较小的实体集,没有这样的嵌套,是的,获得您所寻求的结果会容易得多。见stackoverflow.com/questions/49239548/…
  • 是的,可能是一个解决方案。我会试试的。谢谢。但是返回各种(不同)的查询是什么?
  • 这可能是一个投影查询,它支持distinct 选项,请参阅stackoverflow.com/questions/44865227/…
  • 你误解了我的问题。我有特征,这些特征属于物品。我想检索所有可能的功能。在您的示例中,我需要分别存储所有功能和项目,然后创建第三个实体,指示哪个项目(关系)使用哪个功能。不是最适合大数据,但会起作用。难以维护,因为您需要删除项目的所有关系/特征并重新插入,然后如果项目使用的特征数量发生变化。在我的原始数据结构中,您只需立即使用其嵌套特征更新项目。
  • 数据结构对于良好/高效的数据存储使用至关重要。仅仅因为一种这样的结构更易于更新并不意味着它整体上更易于使用——您还需要考虑检索。只有当您拥有端到端的图片时,您才能真正权衡它。

标签: python pandas nosql google-cloud-datastore


【解决方案1】:

你可以这样做:

[[pair for key,pair in element['infos'].items()] for index, element in enumerate(elements)]

然后,您需要flatten the list。

【讨论】:

  • 这是检索所有项目并遍历它们的 Python 代码。我在考虑 GQL 版本(谷歌查询语言)。
猜你喜欢
  • 2016-05-24
  • 2016-02-04
  • 2015-06-03
  • 1970-01-01
  • 2017-09-09
  • 2015-04-07
  • 2020-01-17
  • 1970-01-01
  • 2019-11-28
相关资源
最近更新 更多