更新时间:2023-11-29 16:08:40
如果您不需要查询数据可以使用性质中的一种作为由@voscausa提到:
JsonProperty
class MyModel(ndb.Model):
city = ndb。 StringProperty()
date = ndb.DateProperty()
data = ndb.JsonProperty()
$ b $ my_model = MyModel(city =somewhere,
date = datetime .date.today(),
数据= { '关键字1':3,
'关键字2':5,
'KEYWORD3':1,})
$ C
$ b StructuredProperty:
class Data( ndb.Model):
keyword = ndb.StringProperty()
count = ndb.IntegerProperty()
class MyModel(ndb.Model):
city = ndb .StringProperty()
date = ndb.DateProperty()
data = ndb.StructuredProperty(Data,repeated = True)
my_model = MyModel(city =somewhere,
date = datetime.date.today(),
data = [Data(keyword =keyword1,count = 3),
Data(keyword =keyword2,count = 5),
Data(keyword =keyword3,count = 1)])
my_model.put()
这里的问题是过滤结构化属性。关键字的属性被视为平行数组。做一个查询,例如:
q = MyModel.query(MyModel.data.keyword =='keyword1',
MyModel.data.count> 4)
会错误地包含 my_model
。
https: //developers.google.com/appengine/docs/python/ndb/queries#filtering_structured_properties
使用expando模型可以工作,并允许您查询关键字:
class MyModel(ndb.Expando):
city = ndb.StringProperty()
date = ndb.DateProperty()
m = MyModel(city =Somewhere,date = datetime.date.today())
m.keyword1 = 3
m.keyword2 = 5
m.keyword3 = 1
m.put()
q = MyModel.query(ndb.GenericProperty('keyword1')> 2)
https://developers.google.com/appengine/docs/python/ndb/entities#expando
From App Engine NDB documentation:
The NDB API provides persistent storage in a schemaless object
datastore. It supports automatic caching, sophisticated queries, and
atomic transactions. NDB is well-suited to storing structured data
records.
I want to create a structure like the following using NDB, where each instance looks like :
{
city: 'SFO'
date: '2013-01-27'
data: {
'keyword1': count1,
'keyword2': count2,
'keyword3': count3,
'keyword4': count4,
'keyword5': count5,
....
}
}
How can I design such a schema-less entity in Google App Engine(GAE) using NDB?
I am new to GAE and not sure how to achieve this
Thank you
If you don't need to query for the attributes in data you can use one of the properties as mentioned by @voscausa:
JsonProperty
class MyModel(ndb.Model):
city = ndb.StringProperty()
date = ndb.DateProperty()
data = ndb.JsonProperty()
my_model = MyModel(city="somewhere",
date=datetime.date.today(),
data={'keyword1': 3,
'keyword2': 5,
'keyword3': 1,})
StructuredProperty:
class Data(ndb.Model):
keyword = ndb.StringProperty()
count = ndb.IntegerProperty()
class MyModel(ndb.Model):
city = ndb.StringProperty()
date = ndb.DateProperty()
data = ndb.StructuredProperty(Data, repeated=True)
my_model = MyModel(city="somewhere",
date=datetime.date.today(),
data=[Data(keyword="keyword1", count=3),
Data(keyword="keyword2", count=5),
Data(keyword="keyword3", count=1)])
my_model.put()
The problem here is filtering for structured properties. The properties of Keyword are viewed as parallel arrays. Doing a query such as:
q = MyModel.query(MyModel.data.keyword=='keyword1',
MyModel.data.count > 4)
would incorrectly include my_model
.
https://developers.google.com/appengine/docs/python/ndb/queries#filtering_structured_properties
Using an expando model would work and allow you to query for keywords:
class MyModel(ndb.Expando):
city = ndb.StringProperty()
date = ndb.DateProperty()
m = MyModel(city="Somewhere", date=datetime.date.today())
m.keyword1 = 3
m.keyword2 = 5
m.keyword3 = 1
m.put()
q = MyModel.query(ndb.GenericProperty('keyword1') > 2)
https://developers.google.com/appengine/docs/python/ndb/entities#expando