我有一个Pojo对象,我在其上存储从Mongo检索到的ObjectID。 当我打印它时,我可以看到:
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 :(得分:0)
试试,
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;
}
您可以找到一个或所有类似的对象ID。
答案 1 :(得分:0)
首先,当我填充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上,我用MongoID _id替换了ObjectId _id,我能够读取正确的ID。 当我使用此ID查询mongo时,我只是使用它:
BasicDBObject query = new BasicDBObject();
query.put("_id", new ObjectId(id));
其中id是一个String,它是:
organization.get_id().getOid()
我不确定这是更好的方式(也可能是正确的)但是它有效。不幸的是,我没有创建时间戳,所以我不得不在我的文档中添加两个键(创建和更新)。