【问题标题】:Google Cloud Datastore get an object from arrayGoogle Cloud Datastore 从数组中获取对象
【发布时间】:2019-07-23 07:32:56
【问题描述】:

如何使用 NodeJs Datastore SDK 按 id 从数组属性中检索对象?

我有一个名为 Team 的 Kind,其属性为 Players。我需要通过 id 获取玩家。

这是一个团队实体的示例:

{
    "id" : "T01",
    "name" : "My Team",
    "city" : "London",
    "players" : [
        {
            "id" : "P01",
            "name" : "John",
            "lastName" : "Doo",
            "height" : "181"
        },
        {
            "id" : "P02",
            "name" : "Mario",
            "lastName" : "Rossi",
            "height" : "185"
        }
    ]
}

【问题讨论】:

  • team.players.find(item => item.id == id) 不适合你吗?

标签: node.js google-cloud-datastore


【解决方案1】:

这样的示例可能会对使用 SDK 有所帮助。

https://github.com/googleapis/nodejs-datastore/blob/master/samples/tasks.list.js

它使用查询:

  const query = datastore.createQuery('Task').order('created');

所以理论上你可以这样做:

  const query = datastore.createQuery('Team').filter('player.id', '=', playerId);

【讨论】:

    【解决方案2】:

    一种可能的解决方案是查询所有团队,然后使用 for 循环 搜索每个团队的 players 属性。下面的示例声明 queryResult 并将其值设置为与所需 ID 匹配的 Player 对象数组:

      const query = datastore.createQuery('Team');
      const desiredId = "P01";
    
      const queryResult = await datastore.runQuery(query).then(results => {
         const teams = results[0];
         let players = [];
         teams.forEach(team => {
             // Below we search for a valid player with the desired ID
             const matchedPlayer = team.players.find(player => player.id == desiredId);
             // If we find a valid player we "push it" to the players array.
             if(matchedPlayer) {
                 players.push(matchedPlayer);
             }
         });
         return players;
      });
    

    【讨论】:

    • 是的,它可以工作,但我正在寻找一种使用数据存储区查询的方法。
    • 如果您要对单个玩家进行大量查询,我建议您为玩家创建一个新的实体类型并将团队 ID 添加为属性。否则,由于您正在查询“团队”,因此您将始终获得整个团队实体。我实际上测试了@sterowney 提供的解决方案,当我过滤players.id 而不是player.id 时它对我有用,但它再次返回了整个团队,我仍然需要遍历每个玩家以只获得我想要的那些.
    猜你喜欢
    • 2014-07-30
    • 2016-05-24
    • 1970-01-01
    • 2018-12-29
    • 2015-12-03
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多