在mongodb中读取数组?

时间:2012-01-22 00:11:46

标签: java mongodb nosql

嗨我在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的情况下获取数组中的东西......但是确定它的工作:)如果有人知道更简单的方法就在这里发布它。谢谢。

4 个答案:

答案 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更新函数

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

答案 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数组中的所有颜色供你玩。

享受!