2014-11-19 3 views
2

Вот определение моего лица:Morphia Запрос по ссылке ObjectID

@Entity("Comment") 
public class Comment extends BaseEntity { 

    @Reference 
    private Merchant merchant; 

    ... 
} 

@Entity("Merchant") 
class Merchant extends BaseEntity{ 
    @Id 
    @Property("id") 
    protected ObjectId id; 

    ... 
} 

А вот мои данные:

comment:{ 
"_id": ObjectId("546c1ac64652e5180dc21577"), 
"merchant" : DBRef("Merchant", ObjectId("546c1ac64652e5180dc21576")), 

... 
} 

Когда я создаю запрос как:

Query<Comment> query = ds.createQuery(Comment.class); 
query.field("merchant").equal(new ObjectId("546c1ac64652e5180dc21576")); 

commentDao.findOne(query); 

Там нет результата, возвращенного , Я хотел бы спросить, что это правильный способ запросить данные комментария с ObjectId торгового объекта?

Благодарим за помощь.

ответ

2
Query<Comment> query = ds.find(Comment.class).disableValidation() 
    .field("Merchant").equal(new Key<>(Merchant.class, merchantId); 

Я думаю, вам нужно отключить проверку, в противном случае вы увидите некоторые довольно ненужное предупреждение.

Вы можете запросить идентификатор DBRef напрямую, но поскольку сам DBRef напечатан, я бы не обошел его, если у вас нет веской причины.

+0

Я добавил функцию disableValidation(), но она по-прежнему не работает. Результат не возвращается. Мне нужно запросить Merchant Object, а затем запросить комментарий этого объекта Merchant. –

+0

1) Это должно быть '' 'Merchant '' '- IMHO довольно необычно использовать эту коллекцию. 2) '' merchantId'' содержит правильный идентификатор и является ObjectId? – xeraa

0

Мне не нравится, как Morphia использует DBRef, когда он может легко использовать только ObjectId (но DBRef содержит имя класса, позволяющее вам подклассифицировать Merchant).

Во всяком случае, вы должны быть в состоянии сделать:

Query<Comment> query = ds.createQuery(Comment.class); 
query.field("merchant.$id").equal(new ObjectId("546c1ac64652e5180dc21576") 

или с чистым драйвером Java

collection.find(new BasicDBObject("merchant", 
    new BasicDBObject("$ref", "Merchant") 
     .append("$id", new ObjectId("546c1ac64652e5180dc21576")))) 
0

Правильный путь, чтобы получить Merchant объект с ID, а затем передать его в Comment запроса:

Query<Merchant> merchantQuery = ds.createQuery(Merchant.class); 
merchantQuery.field("id").equal(new ObjectId(merchantId)); 
Merchant merchant = merchantQuery.get();  // Get the Merchant object 

Query<Comment> commentQuery = ds.createQuery(Comment.class); 
commentQuery.filter("merchant", merchant); 
commentQuery.get()       // Get the Comment object 
0

Вы можете сделать с водителем MongoDB

 MongoClient mongo =new MongoClient(mongoURI); 
     DBCollection dbCollection =mongo.getDB("<your_db>").getCollection("Comment"); 
     DBObject dbObject = (DBObject) JSON.parse("{ 'merchant' : { '$ref' : 'Merchant' , '$id' : { '$oid' : '5693e72244ae9fe4803a4520'}}}"); 

     String json=JSON.serialize(dbCollection.find(dbObject)); 

Примечание сингл qoute в json.

ИЛИ

В морфий нравится:

Query q = MorphiaObject.datastore.find(Comment.class).field("merchant").equal(MorphiaObject.datastore.get(Merchant.class,new ObjectId("5693e72244ae9fe4803a4520")));