英文:
Does datastore require an ancestor to be specified when querying root and children entities of the same type?
问题
例如,从提供的appengine-angular-gotodos中获取以下代码片段:
func getAllTodos(c appengine.Context) ([]Todo, error) {
todos := []Todo{}
ks, err := datastore.NewQuery("Todo").Ancestor(defaultTodoList(c)).Order("Created").GetAll(c, &todos)
if err != nil {
return nil, err
}
for i := 0; i < len(todos); i++ {
todos[i].Id = ks[i].IntID()
}
return todos, nil
}
如果将查询更改为不包括.Ancestor(defaultTodoList(c)).
,该函数将无法返回任何待办事项结果。
- 如果实体保存了祖先,必须通过该祖先进行查询吗?
- 如何查询与它们是子实体还是根实体无关的实体?
- 在建模应用程序时,需要进行无祖先查询时,应考虑哪些性能和架构问题?
英文:
For example, take the following snippet from the provided appengine-angular-gotodos :
func getAllTodos(c appengine.Context) ([]Todo, error) {
todos := []Todo{}
ks, err := datastore.NewQuery("Todo").Ancestor(defaultTodoList(c)).Order("Created").GetAll(c, &todos)
if err != nil {
return nil, err
}
for i := 0; i < len(todos); i++ {
todos[i].Id = ks[i].IntID()
}
return todos, nil
}
If you change the query to not include .Ancestor(defaultTodoList(c)).
the function fails to return any todo results.
- If an entity is saved with an ancestry, must you query it by that ancestor?
- How do you query for Entities regardless of whether they are children, or root entities?
- What are the performance and architecture considerations I should make when modeling my app given the need to do ancestor-less queries?
答案1
得分: 1
如果一个实体被保存时带有祖先信息,你是否必须通过该祖先来查询它?
不,你不必这样做。
如何查询实体,无论它们是子实体还是根实体?
从这里的一个简单示例开始:
// 假设c是你的App Engine上下文
q = datastore.NewQuery("MyObject") // 如果需要,可以在这里添加过滤器和排序。
for t := q.Run(c);; {
var x MyObject
key, err := t.Next(&x)
}
我还在这里找到了这个注释:
注意:设置祖先过滤器可以进行强一致性查询。没有祖先过滤器的查询只返回最终一致性的结果。
这很重要,因为我相信现在所有的数据存储都是高复制的。你可以在这里阅读更多关于高复制数据存储的信息。
英文:
> If an entity is saved with an ancestry, must you query it by that
> ancestor?
No you don't have to.
> How do you query for Entities regardless of whether they are children,
> or root entities?
Reduced to as simple an example as possible from here:
//Assuming c is your appengine context
q = datastore.NewQuery("MyObject") // Can add filters and sorting here if desired.
for t := q.Run(c);; {
var x MyObject
key, err := t.Next(&x)
}
I also found this note here:
> Note: Setting an ancestor filter allows for strongly consistent
> queries. Queries without an ancestor filter only return eventually
> consistent results.
This is important because I believe all datastores are HRD now. You can read more about high replication datastores.
答案2
得分: 0
defaultTodoList(c)
可能不包含代码所期望的父实体。在使用之前,尝试通过将其存储在变量中,然后通过日志记录来验证其值。
英文:
defaultTodoList(c)
might not contain the parent Entity that the code expects it to contain. Try to verify its value somehow before using it, for example by storing it in a variable and then logging data out of it.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论