java - 检索数组中的子文档作为 DBObject(s)

标签 java mongodb mongo-java

我对 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中做的是将房间的名称作为参数,并返回一个与lights数组中的子文档相对应的DBObject集合--“get me all lights for room 'kitchen'”,例如.

到目前为止,我以 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 术语,请纠正我。提前致谢。

最佳答案

所以,你可以这样做:

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 的东西。

关于java - 检索数组中的子文档作为 DBObject(s),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10345788/

相关文章:

java - Bson 过滤 MongoDB

java - 程序类型已存在 : com. google.common.annotations.GwtCompatible

java - 如有必要,插入类型转换以保持类型安全

javascript - AssertionError [ERR_ASSERTION] : handler (func) is required in mongodb

node.js - 在 mongodb 本地时区聚合

java - 如何使用java获取文件关闭事件

java - 如何从java集合中的java对象访问变量?

java - 如何获取结果作为值

java - 如何在 Android Lollipop 中使用 WebView 上传文件?

java - Spark 蓄能器