У меня есть объект Pojo, на котором я храню ObjectID, полученный из Mongo. Когда я его распечатываю, я вижу следующее:

Object: { "_id" : { "$oid" : "5a4b939225c218fbe107199c" }, "organizationId" : "ORGANIZATION_ID", "organizationName" : "Organization name", "storeIds" : [] }

Теперь я хочу выполнить поиск, используя ObjectID, и я использую это:

public String find(String dbId, String collection, ObjectId id) throws Exception {
    BasicDBObject query = new BasicDBObject();
    query.put("_id", id);
    FindIterable<Document> search = collection.find(query);
}

Проблема в том, что поиск всегда нулевой. Как я могу искать, используя ObjectID? Есть ли способ обойтись без извлечения oid и создания запроса таким образом?

query.put("_id", new ObjectId(oid));
0
Andrea Girardi 2 Янв 2018 в 20:12

2 ответа

Лучший ответ

Во-первых, когда я заполняю Pojo и ObjectID значениями, полученными из MongoDB, создается новый объект, поэтому он будет отличаться от полученного.

Я создал новый DataType, добавив эти два класса:

public class MongoOID {

    @SerializedName("$oid")
    private String oid;

    public String getOid() {
        return oid;
    }

    public void setOid(String oid) {
        this.oid = oid;
    }
}

public class MongoId {

    @SerializedName("_id")
    private MongoOID _id;

    /**
     * http://www.baeldung.com/migrating-to-java-8-date-time-api
     */
    private LocalDateTime created;

    /**
     * http://www.baeldung.com/migrating-to-java-8-date-time-api
     */
    private LocalDateTime updated;

    //region Getter and Setter
    public MongoOID get_id() {
        return _id;
    }

    public void set_id(MongoOID _id) {
        this._id = _id;
    }

    public LocalDateTime getCreated() {
        return created;
    }

    public void setCreated(LocalDateTime created) {
        this.created = created;
    }

    public LocalDateTime getUpdated() {
        return updated;
    }

    public void setUpdated(LocalDateTime updated) {
        this.updated = updated;
    }
    //endregion
}

Итак, на моем Pojo я заменил ObjectId _id на MongoID _id, и теперь я могу прочитать правильный идентификатор. Когда я использую этот идентификатор для запроса mongo, я просто использую это:

BasicDBObject query = new BasicDBObject();
query.put("_id", new ObjectId(id));

Где id - это строка, и это:

organization.get_id().getOid()

Я не уверен, что это лучший способ (и, вероятно, правильный), но он работает. К сожалению, у меня нет отметки времени создания, поэтому мне пришлось добавить два ключа в мой документ (созданный и обновленный).

0
Andrea Girardi 5 Янв 2018 в 09:56

Попробуйте как,

import org.bson.types.ObjectId;

public DBObject findDocumentById(String id) {

    BasicDBObject query = new BasicDBObject();
    query.put("_id", new ObjectId(id));

    DBObject dbObj = collection.findOne(query);
    return dbObj;
}

Вы можете найти один или все похожие идентификаторы объектов.

0
MSD 3 Янв 2018 в 07:08