2

次の要素でいっぱいのコレクションを入手した場合

@Entity
public void MyEntity{
  public String name;
  public String type;
  ...
}

そして、要素ではなく、それらのフィールドのみのList<String>(または)を返したいと思います。Setname

List<String> allNames = datasotre.find(MyEntity.class).asList("name");

これはサンプルクエリであり、Morphiaデータストアのそのようなメソッドはありません。

4

3 に答える 3

5

返されるフィールドを制限するには、Queryで「retrievedFields」メソッドを呼び出します。たとえば、すべてのMyEntityオブジェクトの名前フィールドのみを取得するには、次のようにします。

datastore.find(MyEntity.class).retrievedFields( true, "name").asList()

編集-リストに一意の値のみが含まれる(つまり、重複する名前がない)ことを気にしない限り、次のクエリを使用してリスト文字列を取得できます。

DBCollection m = datastore.getCollection( MyEntity.class );
List names = m.distinct( "name", new BasicDBObject() );

「名前」リストには文字列のみが含まれます。

于 2012-08-14T13:19:36.560 に答える
1

ここでの問題は、「キー」の実際のクエリがないことです。クエリはすべて「キー/値ペア」を返します。

理論的には、のフィールドはのフィールドにdatastore.find()マップする必要があるMyEntityため、リフレクションを使用できます。ただし、他の人が別の場所からDBに書き込んでいる場合は、追加のテーブルがシードされている可能性があります。

この場合、Map / Reduceを実行して、すべての「キー」名のリストを取得する必要があります。

ここにサンプルがあります。

于 2012-08-14T17:00:30.953 に答える
0

あなたが探しているdatastore.find(MyEntity.class).retrievedFields(true, "name").asList();。これには、_id属性とname属性が含まれます。

http://code.google.com/p/morphia/wiki/Query#Ignoring_Fieldsを参照してください

于 2012-08-14T13:18:21.573 に答える