使用Go语言在GAE数据存储上使用嵌套结构体

6
我试图弄清楚如何使用Go将嵌套结构与GAE数据存储一起使用。我知道数据存储不支持具体的嵌套结构。当将帖子作为JSON发送给用户时,我需要找到一种简单的方法来获取用户信息。
我想到的一件事是为用户放置两个字段。一个用于ID/键引用用户,另一个用于用户类型结构,在从数据存储加载帖子时将其添加到那里。额外的字段似乎很傻,所以我希望有更好的解决方案。
有两种实体类型或结构:POST和USER。
帖子需要包含有关发布帖子的用户的信息。
我将为用户输出的JSON结构如下所示:
POST - field1 - field2 - USER -- user_field1 -- user_Field2
2个回答

9
Go的Appengine Datastore API提供了PropertyLoadSaver接口来处理这种情况:https://developers.google.com/appengine/docs/go/datastore/reference#PropertyLoadSaver 您可以自由地构建结构体,然后实现该接口的Load和Save方法以正确填充它。这意味着您需要自己编写序列化代码,但是它给了您在如何构造数据方面完全的自由。
这将使您仍然可以过滤字段并具有嵌套结构体。

嘿,Jeremy!抱歉,我之前忘记接受答案了。我已经试用了PropertyLoadSaver接口,它解决了问题。谢谢。 - user1132575

0

Python 运行时有 ndb 库,支持像这样的嵌套结构。Go 不支持,所以我可以想到两个解决方案:

  1. 在 POST 类型中,添加一个用户字段作为关键字,引用具有必要字段的 USER 类型。需要两次获取和往返。
  2. 在 POST 类型中创建一个用户字段作为 blob。 blob 是一个字符串,在 go 中进行 [de]序列化。这意味着您无法搜索或过滤任何用户数据,但它也允许您将所有内容存储在一个实体中。

您应该根据应用程序的需求使用这些功能。如果您需要用户是真实的事物,请使用 1。如果用户不是必须处理的对象(即仅用于显示的数据),则可以使用 2。


嗨 @mjibson,我现在使用给出的答案的组合:需要两次往返,但是通过PropertyLoadSaver接口完成。为了可维护性,我选择不使用blob。感谢您的回答! - user1132575

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接