2012-07-18 34 views
0

我正在使用MongoDB和java-lib Morphia來處理它。Morphia嵌入的鏈接對象列表搜索條件

我有兩類:

class User { 
    ... 

    #Reference 
    private List<Invoice> invoiceTransactions = new ArrayList<Invoice>(); 

    ... 
} 

class Invoice { 
    ... 

    User user; 

    ... 
} 

當我創建發票我把它放到invoiceTransactions列表

現在我有一個發票對象,我的目標是找到相應的用戶如果它不包含此發票在invoiceTransactions列表中。

這是我寫的:

Invoice invoice = ...; 

Query<User> query = (Query) dao.createQuery(); 
query.disableValidation().filter(Mapper.ID_KEY, u.getId()); 
List<Invoice> inv = new ArrayList<Invoice>(); 
inv.add(invoice); 
query.criteria(User.INVOICE_TRANSACTIONS).hasNoneOf(inv); 

這是MongoDB的日誌:

Wed Jul 18 19:03:09 [conn48] update dwh.UserImpl query: { _id: ObjectId('4ffbc8d 
943b693ac766255f3'), InvoiceTransactions: { $nin: [ { className: "abc.InvoiceImpl", sum: 70.0, invoiceStatus: "NEW", creationDate: 
new Date(1342627389037), _id: ObjectId('5006de3d022993ac397609c4'), guid: "4DEAB 
CCE-63F9-1B0A-59F2-1135A83054B9", day: "2012.07.18", hour: "2012.07.18 19", minu 
te: "2012.07.18 19:03" } ] } } update: { $set: { authId: "bla-bla" } } 0ms 

你可以看到,發票對象處理不喜歡參考但像嵌入式目的。因此,即使實際上invoiceTransactions包含發票,我也有該標準觸發。

所以,我的問題是如何強制morphia查看inv對象作爲參考沒有把它放入結果查詢與所有領域?

回答

0

歐凱,這裏是答案:

Key<Invoice> invoiceKey = dao.getDatastore().getKey(invoice); 
List<Key<Invoice>> invoiceKeyList = new ArrayList<Key<Invoice>>(); 
invoiceKeyList.add(invoiceKey); 
query.criteria(User.INVOICE_TRANSACTIONS).hasNoneOf(invoiceKeyList);