Запрос 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 продавца?

Спасибо за вашу помощь.


person Zachary Tang    schedule 19.11.2014    source источник


Ответы (4)


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

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

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

person xeraa    schedule 19.11.2014
comment
Я только что добавил функцию disableValidation(), но она все еще не работает. Результат не возвращается. Я должен запросить объект продавца, а затем запросить комментарий этого объекта продавца. - person Zachary Tang; 20.11.2014
comment
1) Должно быть "Merchant" — ИМХО довольно необычно капитализировать коллекцию. 2) merchantId содержит правильный идентификатор и является ObjectId? - person xeraa; 20.11.2014

Мне не нравится, как 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"))))
person Nic Cottrell    schedule 19.11.2014

Правильный способ — получить объект Merchant с идентификатором, а затем передать его в запрос 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
person Mariano Ruiz    schedule 29.01.2016

Вы можете сделать с драйвером 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));

Обратите внимание на одинарную кавычку в файле json.

OR

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

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