2012-03-28 58 views
0

我有mongodb運行和使用嗎啡。
收集了BatchData文檔並需要過濾掉一些字段值。在嗎啡如何查詢和返回一個字段基於另外兩個整數字段是否相同

這是實體:

@Entity 
public class BatchData { 

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

} 

如果val1等於val2那麼該查詢應該返回uuid

這是儘可能的獲取,但ofcourse它不工作:

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) 

可以有一百萬或更多BatchData文件所以我只能
返回uuid出於性能原因。

在閱讀維基和無法理解或看到一個過濾器有兩個成員字段
Morphia wiki

回答

1

如果性能非常重要,則應該查看map-reduce函數。不幸的是,morphia不支持這個MongoDB功能,所以你需要使用java mongo驅動程序本身。請參閱exampledocs

+0

是的,這看起來像我需要閱讀.. – Erik 2012-03-31 09:43:34

1

我不認爲這是在嗎啡任何整潔的方式做到這一點,但是你可以使用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); 

這不是超級快,因爲它需要解壓縮和掃描每個對象,不能使用索引,但它會做你想要什麼。

+0

還沒有到BasicDBObject,但現在我知道那是什麼,謝謝 正在考慮我想要的是一些基本的嗎啡算子的常見問題。如果我有數以百萬計的文檔,認爲使用BasicDBObject會很慢。那麼map-reduce是不是某些搜索算法呢? – Erik 2012-03-29 13:04:19

+0

Morphia只是一個用戶友好的包裝器,它創建了'DBObject',它們通過相同的Java庫發送。這很慢的原因是MongoDB服務器內部完成的工作。 – 2012-03-29 13:14:46

相關問題