0

MongoDB と java-lib Morphia を使用して対処しています。

私は2つのクラスを持っています:

class User {
   ...

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

   ...
}

class Invoice {
   ...

   User user;

   ...
}

請求書を作成するときは、invoiceTransactionsリストに入れます

これでInvoiceオブジェクトができ、 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

Invoiceオブジェクトが参照ではなく埋め込みオブジェクトのように処理ていることがわかります。その結果、invoiceTransactionsに実際に Invoice が含まれている場合でも、その基準が発動します。

だから、私の質問は、すべてのフィールドを持つ結果のクエリにそれを入れずに、モルフィアがinvオブジェクトを参照するように強制する方法ですか?

4

1 に答える 1

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);
于 2012-07-19T08:35:23.990 に答える