5

私はドキュメント、ドキュメント、SO の質問と回答に目を通しましたが、これの小さな部分を理解するのにまだ苦労しています。どちらをいつ選ぶべきですか?

これは私がこれまでに読んだものです(単なるサンプル):

キークラスは私にはかなり簡単に思えます。ndb エンティティを作成すると、データストアは通常、id が作成される key(Kind, id) の形式でキーを自動的に作成します。

たとえば、次の 2 つのモデルがあるとします。

class Blah(ndb.Model):
     last_name = ndb.StringProperty()

class Blah2(ndb.Model):
     first_name = ndb.StringProperty()
     blahkey = ndb.KeyProperty()

したがって、キーの種類を使用するだけで、Blah1 を親にしたい (または同じ姓を持つ複数の家族を持ちたい)

lname = Blah(last_name = "Bonaparte")
l_key = lname.put() **OR**
l_key = lname.key.id() # spits out some long id 

fname_key = l_key **OR**
fname_key = ndb.Key('Blah', lname.last_name) # which is more readable.. 

それから:

lname = Blah2( parent=fname_key, first_name = "Napoleon")
lname.put()

lname2 = Blah2( parent=fname_key, first_name = "Lucien")
lname2.put()

ここまでは順調です(と思います)。次に、Blah2 の KeyProperty について説明します。Blah1 がまだ同じであると仮定します。

lname3 = Blah2( first_name = "Louis", blahkey = fname_key)
lname3.put()

これは正しいです ?

さまざまなことを照会する方法

クエリの姓:

Blah.query() # all last names
Blah.query(last_name='Bonaparte') # That specific entity.

ファーストネーム:

Blah2.query()
napol =   Blah2.query(first_name = "Napoleon")
bonakey = napol.key.parent().get() # returns Bonaparte's key ??

bona = bonakey.get() # I think this might be redundant

これは私が迷子になるところです。key または keyproperty を使用して名から Bonaparte を検索する方法。ここには追加しませんでしたが、おそらく追加する必要があります。これは、キーが祖先/親を追跡しているため、親、祖父母、偉大な祖父母の議論です.

KeyProperty と固有のキー クラスを使用する方法と理由。また、3 つのセンサー s1、s2、s3 があるとします。各センサーには数千の読み取り値がありましたが、s1 の今日のすべての読み取り値をグラフ化できるように、s1 に関連付けられた読み取り値を保持したいと考えています。どちらを使用しますか? KeyProperty またはキー クラス ? これが他の場所で回答されている場合は申し訳ありませんが、どちらを選択するか、なぜ/どのように選択するかについての明確な例/ガイドがありませんでした。

4

2 に答える 2

2

混乱はキーの使用に起因すると思います。キーは、エンティティ内のプロパティには関連付けられていません。単一のエンティティを特定するための一意の識別子にすぎません。数値または文字列のいずれかです。

幸いなことに、次の 1 行を除いて、すべてのコードは適切に見えます。

fname_key = ndb.Key('Blah', lname.last_name) # which is more readable.. 

キーの作成には一意の ID が必要ですが、これはプロパティとは異なります。つまり、変数lname.last_nameをプロパティに関連付けませんlast_name。代わりに、次のようにレコードを作成できます。

lname = Blah(id = "Bonaparte")
lname.put()
lname_key = ndb.Key('Blah', "Bonaparte")

その ID を持つ Blah エンティティは 1 つだけであることが保証されます。実際、last_name のような文字列を ID として使用する場合、別のプロパティとして保存する必要はありません。エンティティ ID は、一意の追加の文字列プロパティと考えてください。

次に、クエリで Blah.last_name と Blah2.first_name が一意であると想定しないように注意してください。

lname = Blah2( parent=fname_key, first_name = "Napoleon")
lname.put()

これを複数回行うと、first_name が Napoleon のエンティティが複数存在します (すべて同じ親キーを持ちます)。

上記のコードを続行します。

napol =   Blah2.query(first_name = "Napoleon")
bonakey = napol.key.parent().get() # returns Bonaparte's key ??
bona = bonakey.get() # I think this might be redundant

napol結果ではなくクエリを保持します。napol.fetch()「ナポレアン」を含むすべてのエンティティを取得するには、呼び出す必要がありnapol.get()ます (または、エンティティが 1 つしかないことが確実な場合)。 bonakeyは逆で、Bonaparte のキーではなく get() のために親エンティティを保持します。.get() をオフのままにしておくと、bona正しく親が作成されます。

最後に、センサーについての質問です。KeyProperty または「固有の」キーは必要ない場合があります。次のような Readings クラスがある場合:

class Readings(ndb.Model):
    sensor = ndb.StringProperty()
    reading = ndb.IntegerProperty()

次に、それらすべてをキーなしで単一のテーブルに格納できます。(タイムスタンプやその他の属性を含めることもできます。) 後で、次のクエリで取得できます。

s1_readings = Readings.query(Readings.sensor == 'S1').fetch()
于 2013-05-31T01:07:31.317 に答える
1

私もNDBは初めてで、今のところまだすべてを理解していませんが、 Napoleonの親を持つBlah2を作成すると、親がクエリを実行する必要があるか、表示されないと思います。例えば:

napol = Blah2.query(first_name = "Napoleon")

何も取得しません (そして、NDB に適切な形式を使用していません) が、親を使用すると次のようになります。

napol = Blah2.query(ancestor=fname_key).filter(Blah2.first_name == "Napoleon").get

これがあなたの質問に光を当てるかどうかはわかりません。

于 2013-05-30T10:54:22.617 に答える