GAE でのクエリ フィルタリング: 一貫性のない結果とカウンタの不一致の解決
次のシナリオを考えてみましょう: 2 つのレコードがデータストアに挿入され、1 つは1 人は「ジョー シチズン」という名前、もう 1 人は「アンドリュー W.」という名前です。ただし、後続のクエリを実行して「Andrew W」という名前のレコードを取得すると、予期せず「Joe Citizen」が返され、クエリ フィルタが正しく機能していないことが示されます。さらに、カウンターには 2 が表示され、レコードが 1 つだけ期待されている場合に 2 つのレコードが存在することを示します。この問題は、クエリ フィルタリングを修正し、不一致に対処するための調査を必要とします。
クエリ フィルタリングについて
この問題は、最初のクエリ構築における見落としが原因で発生します。 Go の Datastore API では、Query.Filter() メソッドは、指定されたフィルターが適用された新しいクエリ オブジェクトを返します。元のクエリ オブジェクトは変更されません。したがって、返されたクエリを新しい変数に割り当てることが重要です。
// Incorrect approach that does not apply the filter q := datastore.NewQuery("employee") q.Filter("Name =", "Andrew W") // Correct approach that assigns the new query with the filter applied q = datastore.NewQuery("employee").Filter("Name =", "Andrew W")
結果整合性への対処
GAE データストアは結果整合性を遵守します。これは、次のことを意味します。データの更新は、後続のクエリですぐに表示されない場合があります。これに対処するには、クエリを実行するコードに短い遅延を導入し、データが伝播するのに十分な時間を確保します。
time.Sleep(time.Second) var e2 Employee q := datastore.NewQuery("employee").Filter("Name=", "Andrew W")
オプションの拡張機能
強い一貫性のある結果を得るには、キーの作成時に祖先キーの使用を検討し、祖先クエリを使用します。祖先キーにより、結果整合性の考慮事項に関係なく、同じエンティティ グループ内の操作が一貫して処理されることが保証されます。
key := datastore.NewKey(c, "employee", "", 0, ancestorKey)
最終的に、これらの問題に対処することで、クエリ フィルタリングは期待どおりに機能し、目的のレコードとデータストア内のカウンタ値を正確に反映します。
以上がGoogle App Engine データストア クエリが一貫性のない結果を返し、間違ったカウンタ値を表示するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。