0

我有运行和使用 morphia 的 mongodb。
有一个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();

或者

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

可能有 100 万个或更多BatchData文档,所以我只能出于性能原因
返回。uuid

一直在阅读 wiki,但无法理解或看到两个成员字段的过滤器
Morphia wiki

4

2 回答 2

1

我认为 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);

它不是超级快,因为它需要解包和扫描每个对象并且不能使用索引,但它会做你想做的事。

于 2012-03-29T12:40:24.123 回答
1

如果性能很重要,你应该看看 map-reduce 功能。不幸的是,morphia 不支持此 MongoDB 功能,因此您需要使用 java mongo 驱动程序本身。请参阅示例文档

于 2012-03-30T23:03:06.647 回答