过滤Google Datastore查询中子实体属性上的实体

问题描述 投票:2回答:2

我的数据存储区实体将具有embedded entity type的属性。

我将它们保存为以下(我正在使用gcloud v0.27.0):

dataset.save([{
    key: dataset.key({ path: ['MyKind', 1] }),
        data: {
            foo: 'bar',
            zxc: {
                nested: {
                    foobar: 32
                }
            }
        }
    }, 
    {
        key: dataset.key({ path: ['MyKind', 2] }),
        data: {
            foo: 'a string',
            zxc: {
                nested: {
                    foobar: 132
                }
            }
        }
    }
    ], function(error) { console.log(error); });

有没有办法查询具有zxc.nested.foobar=132的实体?

我运行查询,如下图所示,它没有显示结果。

enter image description here

google-cloud-datastore
2个回答
3
投票

您可以通过将属性名称与点连接并使用该连接的字符串作为查询中的属性名称来完成此操作。

在Cloud Datastore v1beta3 API中,JSON请求如下所示:

{
  "query": 
  {
    "kinds": 
    [
      {
        "name": "MyKind"
      }
    ],
    "filter": 
    {
      "propertyFilter": 
      {
        "property": 
        {
          "name": "zxc.nested.foobar"
        },
        "operator": "EQUAL",
        "value": 
        {
          "integerValue": "132"
        }
      }
    }
  }
}

请注意,为了显示结果,必须为每个属性编制索引。默认情况下,JSON API就是这种情况:

{
  "key": 
  {
    "path": 
    [
      {
        "kind": "MyKind",
        "id": 1
      }
    ]
  },
  "properties": 
  {
    "zxy": 
    {
      "entityValue": 
      {
        "properties": 
        {
          "nested": 
          {
            "entityValue": 
            {
              "properties": 
              {
                "foobar": 
                {
                  "integerValue": "132"
                }
              }
            }
          }
        }
      }
    }
  }
}

数据存储客户端库通常也默认为索引属性,但某些旧版本的gcloud-node(例如0.27.0)可能不会。


2
投票
const Datastore = require('@google-cloud/datastore');
// Your Google Cloud Platform project ID
const projectId = 'your-project-id';
// Creates a client
const datastore = new Datastore({
  projectId: projectId,
});
let query = datastore.createQuery('MyKind');
let query = query.filter('xyz.foobar', '=', 32);
query.run()
  .then( (results) => {
    //do your thing
  });

我知道我迟到了,但是如果有人需要它,这就是它。它适用于"@google-cloud/datastore": "^1.3.4"

© www.soinside.com 2019 - 2024. All rights reserved.