【问题标题】:Is there a limit to how many Ancestors an Entity can have?一个实体可以拥有多少祖先有限制吗?
【发布时间】:2015-10-10 13:36:14
【问题描述】:

我正在尝试将现有(项目)实体设置为另一种(评级)实体的父级。这样我就可以让我的用户对商品进行评分。

目前,Item 实体有一个祖先和不同种类的祖先等,如下所示。在方案 1 中,无法找到作为评级的父项输入的项目实体。但在场景 2 中,它运行良好。

Scenario 1                                       Scenario 2
 Category
    v
  Aisle
    v
  Group
    v
  Type
    v
  Item >>>>> getKey()                   Item >>>>> getKey()
                v                                     v
              Rating                                Rating

请帮忙!当该项目没有祖先时,它可以正常工作,但是当它具有所有祖先时,我需要它来让它不起作用!!!

这是我正在使用的代码。

 DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService();
int rating = Integer.parseInt(req.getParameter("rating"));                                 
String type = req.getParameter("type");                                                    
String raterid = req.getParameter("rater");                                                
String target =  req.getParameter("target");                                               
Key k = KeyFactory.createKey("Item", Long.parseLong(target));
Entity trgt = null;
try {
    trgt =  datastoreService.get(k);
} catch (EntityNotFoundException e) {
    e.printStackTrace();
}
  Key k = KeyFactory.("Item", target);
Key r;
String raterkind;
if (type=="user"){
    raterkind = "Deliverer";
}
else  {raterkind = "Customer";}
r = KeyFactory.createKey(raterkind,raterid);
Entity ratingentity = null;
if (trgt != null) {
    ratingentity = new Entity("rating",trgt.getKey());
}
else {
    ratingentity = new Entity("rating",k);
}
ratingentity.setProperty("target",k);
ratingentity.setProperty("rating",rating);
ratingentity.setProperty("rater",r);
datastoreService.put(ratingentity);

这里有一些图片来展示正在发生的事情。

这些是项目实体。

如您所见,这个项目很简单,没有任何额外的祖先键。你可以在下面看到它的工作原理。

这是与父母/祖先的关系。

如下所示,它不起作用。

【问题讨论】:

  • 你读过这个吗?:cloud.google.com/appengine/articles/scaling/contention?hl=en 特别是关于保持实体组小的部分。
  • 您需要显示一些代码 - 您如何尝试检索 Item?您的问题也不清楚:您说 Item 实体有多个祖先 - 它有 一个 祖先,Type,而后者又具有另一个祖先。一个实体只能有一个直系祖先。
  • 好的,我看过文档,我想我天真地认为我可以在没有任何问题的情况下引入这个级别而不是祖先@Kekito。
  • 感谢@tx802 的其他帖子的链接,这很有意义,也许我不需要比实际项目高出这么多级别。拥有一种称为 parentCategory 的想法是有道理的。如果他们都是同类,我还能保持这种水平的血统并避免这些问题吗?

标签: google-app-engine google-cloud-datastore


【解决方案1】:

你有:

String target =  req.getParameter("target");                                               
Key k = KeyFactory.createKey("Item", Long.parseLong(target));

这将为您提供 an 项的密钥,其 ID 为 long,无论 target 的值是多少。这可能不是您要查找的Item

假设您的 trgt 是场景一中的 Item,您不能仅通过 id 检索它 - 您需要 Category > Aisle > Group > Type > Item 的完整密钥路径,因为 ID 仅在实体组中是唯一的。

此外,您的raterkind 将始终为"Customer" - you want

if (type.equals("user")) {...}

而不是

if (type=="user") {...}

【讨论】:

  • 感谢 == 的事情。我明白你所说的关于获得整个钥匙的说法。我创建了一个 Item 属性来显示它自己的键,结果是 Key('Category', 'FoodCupboard', 'Aisle', 'RPN', 'Group', 'Rice', 'Type', 'Basmati', 'Item', 5649050225344512) 我如何让它从任何实体组中找到密钥?
  • 我刚刚将项目更改为主要实体。不过感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 2023-03-25
  • 2017-09-28
  • 2018-11-05
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
相关资源
最近更新 更多