3

App Engine NDBのドキュメントから:

NDB API は、スキーマレス オブジェクト データストアに永続ストレージを提供します。自動キャッシング、高度なクエリ、およびアトミック トランザクションをサポートします。NDB は、構造化されたデータ レコードの保存に適しています。

各インスタンスが次のように見える NDB を使用して、次のような構造を作成したいと考えています。

{
 city: 'SFO'
 date: '2013-01-27'
 data: {
           'keyword1': count1,
           'keyword2': count2,
           'keyword3': count3,
           'keyword4': count4,
           'keyword5': count5,
           ....
       }
}

NDB を使用して Google App Engine(GAE) でこのようなスキーマのないエンティティを設計するにはどうすればよいですか?
私はGAEを初めて使用し、これを達成する方法がわかりません

ありがとうございました

4

2 に答える 2

8

データ内の属性を照会する必要がない場合は、@voscausa で言及されているプロパティの 1 つを使用できます。

Json プロパティ

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,})

構造化プロパティ:

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()

ここでの問題は、構造化されたプロパティのフィルタリングです。Keyword のプロパティは、並列配列として表示されます。次のようなクエリを実行します。

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

于 2013-01-29T02:40:17.970 に答える
2

を使用しndb.JsonPropertyて、リスト、辞書、またはモデル内の文字列を表すことができます。詳細については、ドキュメントを参照してください。

于 2013-01-29T11:17:51.153 に答える