我是MongoDB的新手,我正在使用它和Java驱动程序。我有这个文档结构:
{ "_id" : ObjectId("4f7d2ba6fd5a306d82687d48"), "room" : "Den" }
{ "_id" : ObjectId("4f7d2baafd5a306d82687d49"), "room" : "Foyer" }
{ "_id" : ObjectId("4f7d2fdcfd5a306d82687d4a"), "room" : "Master Bedroom" }
{ "_id" : ObjectId("4f7d301afd5a306d82687d4b"), "room" : "Guest Bedroom" }
{ "_id" : ObjectId("4f7d2b98fd5a306d82687d47"), "code" : "A", "lights" : [ { "name" : "Overhead", "code" : "1" } ], "room" : "Kitchen" }
最后一行特别有兴趣说明我想做什么。每个文档都是一个房间,并且可以具有对应于作为子文档阵列的值的“灯”键。从建模的角度来看,我有一个房子,它有0-n个房间,每个房间都有0-n个灯。我想在Java中做的是将房间的名称作为参数,并返回对应于灯光阵列中的子文档的DBObject集合 - “让我所有灯光为房间'厨房'”,例如
到目前为止,在TDD风格中逐步进行,我构建了这个查询:
public static final String ROOM_KEY = "room";
public static final String EQUALS_KEY = "$eq";
private BasicDBObject buildRoomNameQuery(String roomName) {
BasicDBObject myQuery = new BasicDBObject();
myQuery.put(ROOM_KEY, new BasicDBObject(EQUALS_KEY, roomName));
return myQuery;
}
我意识到这将为我提供我传递的房间名称的整个房间文件。我有点坚持从这里开始的最佳方式是获得我想要的东西。我正在用简单的查询做什么,或者我是否必须检索数组并在代码中迭代它,将元素转换为DBObject?我也愿意为我的目的建立更好的文件结构 - 我不会以任何方式与这种结构结合。
从某种角度来看,我非常精通SQL和传统的关系数据库,如果这对解释性类比有帮助的话。另外,如果我正在屠杀MongoDB术语,请纠正我。提前谢谢。
答案 0 :(得分:19)
所以,你可以这样做:
DBCollection coll = db.getCollection("test");
BasicDBObject query = new BasicDBObject("room", "Kitchen");
// optional, limit the fields to only have the lights field
BasicDBObject fields = new BasicDBObject("lights",1).append("_id",false);
DBCursor curs = coll.find(query, fields);
while(curs.hasNext()) {
DBObject o = curs.next();
// shows the whole result document
System.out.println(o.toString());
BasicDBList lights = (BasicDBList) o.get("lights");
// shows the lights array -- this is actually a collection of DBObjects
System.out.println(lights.toString());
// optional: break it into a native java array
BasicDBObject[] lightArr = lights.toArray(new BasicDBObject[0]);
for(BasicDBObject dbObj : lightArr) {
// shows each item from the lights array
System.out.println(dbObj);
}
}
另外,我建议在Java驱动程序中使用QueryBuilder - 它比从DBObjects创建查询更简洁。更好的是,查看Morphia,它是一个使用Java驱动程序的对象映射器。它原生支持在其中包含列表的实体模型,并将它们序列化/反序列化为Mongo,而无需处理DBObject内容。
答案 1 :(得分:1)
看看spring mongo包。使用POJO文档使用mongodb的一种非常好的方法
http://www.springsource.org/spring-data/mongodb
您不需要执行转换和使用字符串
答案 2 :(得分:1)
您可以使用字段
的迭代器Iterator<DBObject> fields = curs.iterator();
while(fields.hasNext()){
DBObject field = (DBObject) fields.next().get("lights");
System.out.println(field.get("name"));
}
答案 3 :(得分:0)
对于较新版本,请考虑使用Document
。要避免未经检查的强制转换和linter警告,以及编写自己的循环,请使用libary的get(final Object key, final Class<T> clazz)
方法:
List<Document> comments = posts.get("comments", docClazz)
其中docClazz
是您创建的内容之一:
final static Class<? extends List> docClazz = new ArrayList<Document().getClass();