【问题标题】:in morphia how to query and return a field based on two other integer fields are same or not在morphia中如何根据其他两个整数字段查询和返回字段是否相同
【发布时间】:2012-03-28 00:55:00
【问题描述】:

我正在运行 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();

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

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

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

【问题讨论】:

    标签: java mongodb morphia


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 还没有接触到 BasicDBObject 但现在我知道那是什么了,谢谢 正在想我想要的是一些基本 morphia 运算符的常见问题。如果我有数百万个文档,认为使用 BasicDBObject 会很慢。 map-reduce 是不是某种搜索算法呢?
      • Morphia 只是一个用户友好的包装器,它创建了DBObjects,它们通过同一个 Java 库发送。这很慢的原因是 MongoDB 服务器内部完成的工作。
      猜你喜欢
      • 2020-09-29
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多