嗨我在mongodb中的数组有些麻烦。使用java读取文档没有问题,但是读取数组文档中的内容是个问题。可以说我有一个集合myCol:
{"name": "lenny linux", "gender": "m", "computers": [{"name": "computer"}, {"name": "computer2"} {"name"...}]}
所以有一个带有计算机的阵列。我可以用
阅读整个文件 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中(就像我第一次在我的代码中一样),然后使用extern JSON解析器解析这个文档,如json-simple。好吧也许这不是最好的解决方案,因为最好的解决方案是在没有其他库只使用mongolib的情况下获取数组中的东西......但是确定它的工作:)如果有人知道更简单的方法就在这里发布它。谢谢。
答案 0 :(得分:1)
如果我想删除mongodb中的内容,该怎么办? 阵列?它与删除普通文件不同。
http://www.mongodb.org/display/DOCS/Updating解释了两种方式:
$ set:用新的数组替换当前数组(获取前一个数组,删除一个或两个元素,并使用$ set进行更新)
db.users.update({name : "lenny linux"}, {$pull : { computers : { name : "computer2" } }}, false, false)
从computers
'计算机2'的数组name
中删除所有元素。
答案 1 :(得分:1)
当使用对象(命名元素)到达数组时,您希望使用点符号来到达数组。
db.myColl.find({'computers.name':'computer'});
http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray
对于从数组中删除项目,您希望查看$pop
和$pull
更新函数
答案 2 :(得分:0)
由于我在Java中处理这个问题,而你的代码是用Java编写的,因此这里有解决方案...... in 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<Object> 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<String> if I needed
updateTrustee((String)nextItem);
}
我使用一些System.out.println(Object.getClass())
来解决这个问题,以了解我需要投射哪些课程。
答案 3 :(得分:0)
他问的问题是如何在Mongo集合中存储的数组中返回所有元素,而不知道这些元素的确切数量或数量。您没有对已知值执行查询,而只是要求转储Mongo数组中的内容。例如,如果您的Mongo数组名称是&#34; colors&#34;,只需执行以下操作:
@colors = @ {$ record-&gt; {colors}};
现在你拥有Perl数组中的所有颜色供你玩。
享受!