в морфии, как запрашивать и возвращать поле на основе двух других целочисленных полей, совпадают или нет

У меня запущен mongodb и я использую morphia.
Имею коллекцию BatchData документов и мне нужно отфильтровать некоторые значения полей.

Это Сущность:

@Entity
public class BatchData {

  @Id private ObjectId id;
  public int val1;
  public int val2;
  public String uuid;

}

Если val1 равно val2, тогда запрос должен вернуть uuid

Это пока что, но, конечно, это не работает:

Query<BatchData> q = mongo.createQuery(BatchData.class).field("val1").equal("val2");
List<BatchData> entities = q.asList();

OR

Query<BatchData> q = mongo.createQuery(BatchData.class).field("val1").equal(BatchData.class.val2)

Может быть один миллион или более BatchData документов, поэтому я должен только вернуть uuid по соображениям производительности.

Читал вики, но не могу понять или увидеть фильтр для двух полей элементов
Morphia вики


person Erik    schedule 28.03.2012    source источник


Ответы (2)


Если производительность очень важна, вы должны посмотреть на функцию map-reduce. К сожалению, morphia не поддерживает эту функцию MongoDB, поэтому вам нужно работать с самим драйвером java mongo. См. пример и документы.

person vacuum    schedule 30.03.2012

Я не думаю, что в Morphia есть какой-то изящный способ сделать это, но вы можете использовать базовую библиотеку Java MongoDB и использовать поддерживающий Javascript оператор $ where.

BasicDBObject query = new BasicDBObject( "$where",  
   "function() { return this.val1 == this.val2 }" );
DBCollection fieldsCollection = db.getCollection("BatchData");
DBCursor cursor = fieldsCollection .find(query);

Это не очень быстро, так как ему нужно распаковывать и сканировать каждый объект и не может использовать индексы, но он будет делать то, что вы хотите.

person Nic Cottrell    schedule 29.03.2012
comment
Еще не дошел до BasicDBObject, но теперь я знаю, что это такое, спасибо. Я думал, что то, что я хотел, было общей проблемой с некоторым базовым оператором морфии. Думаю, использование BasicDBObject будет медленным, если у меня есть миллионы документов. А что насчет map-reduce - это не какой-то алгоритм поиска? - person Erik; 29.03.2012
comment
Morphia - это просто удобная оболочка, которая создает DBObject, которые отправляются через ту же библиотеку Java. Причина, по которой это происходит медленно, заключается в работе, выполняемой на сервере MongoDB. - person Nic Cottrell; 29.03.2012