在mongodb中读取数组?

嗨我在mongodb中的数组有些麻烦。 使用java读取文档没有问题,但是读取数组文档中的内容是个问题。 可以说我有一个集合myCol:

{"name": "lenny linux", "gender": "m", "computers": [{"name": "computer"}, {"name": "computer2"} {"name"...}]} 

所以有一个带计算机的arrays。 我可以阅读整个文件

  DBCollection myCol = getCollection(...); BasicDBObject query = new BasicDBObject(); query.put(name, "lenny linux"); DBCursor cursor = myCol.find(query); while (cursor.hasNext()) { System.out.print(cursor.next()); } 

但我只需要计算机的名称,所以我必须以某种方式阅读数组。 不要在mongodb中获得这个数组的东西。 如果我想从mongodb数组中删除一些内容呢? 它与删除普通文件不一样…谢谢你的帮助!

编辑:如果我正在阅读mongodb页面: http : //www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray我真的不明白。 他们有一系列的颜色,然后他们像这样读红色:

 db.things.find({ colors :"red" }); 

我为什么要这样做? 如果我想读取数组以了解数组中的内容。 用户不知道有“红色”或蓝色或其他什么。 也许数组颜色是空的? 然后我得到一个零,0或其他什么,如果有4种颜色然后给我这些颜色,打印出来。 我没有其他任何例子……对不起我的英语不好。

Edit2:好的,所以对我来说新的解决方案是将整个文档放在name == lenny linux中(就像我第一次在我的代码中),然后使用像json-simple这样的extern JSON解析器来解析这个文档。 好吧也许这不是最好的解决方案,因为最好的解决方案是在没有其他库只使用mongolib的情况下获取数组中的东西……但是确定它的工作:)如果有人知道更简单的方法就在这里发布它。 谢谢。

如果我想从mongodb数组中删除一些内容呢? 它与删除普通文件不同。

http://www.mongodb.org/display/DOCS/Updating解释了两种方式:

  • $ set:用新的数组替换当前数组(获取前一个数组,删除一个或两个元素,并用$ set更新)

  • db.users.update({name : "lenny linux"}, {$pull : { computers : { name : "computer2" } }}, false, false)name “computer2”的arrayscomputers中删除所有元素。

当使用对象(命名元素)到达数组时,您希望使用点符号到达数组。

db.myColl.find({'computers.name':'computer'});

http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

至于从数组中删除项目,您想要查看$pop$pull更新函数

http://www.mongodb.org/display/DOCS/Updating

因为我在Java中处理这个问题,而你的代码是用Java编写的,所以这里是java中的解决方案。

基本上当你get(key)一个MongoDB数组时,它会返回一个com.mongodb.BasicDBList对象,你可以得到它的迭代器。

在我的代码中,我查询如下所示的文档:

 { "_id": ObjectID("52d60db91f3aa664410bcde5"), "owner": "Amy", "trusted": [ "amy", "paul", "randy" ] } 

当我需要找到这个文档的可信人员时,我使用((BasicDBList) doc.get("trusted")).listIterator();

  DBObject doc = collection.findOne(new BasicDBObject("owner", "Amy")) ListIterator trustedList = ((BasicDBList) doc.get("trusted")).listIterator(); while(trustedList.hasNext()){ Object nextItem = trustedList.next(); System.out.println(nextItem.getClass()); // String // Here I handle what to do to each name. // I could add them to an ArrayList if I needed updateTrustee((String)nextItem); } 

我使用一些System.out.println(Object.getClass())来解决这个问题,以了解我需要构建哪些类。

他问的问题是如何返回存储在Mongo集合中的数组中找到的所有元素,而不知道这些元素的确切数量或数量。 您没有针对已知值执行查询,而只是要求转储Mongo数组中的内容。 例如,如果您的Mongo数组名称是“colors”,则只需执行以下操作:

@colors = @ {$ record – > {colors}};

现在你拥有Perl数组中的所有颜色供你玩。

请享用!