【问题标题】:Reading an array in mongodb?在 mongodb 中读取数组?
【发布时间】:2012-01-22 00:11:46
【问题描述】:

您好,我在 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 种颜色,那么给我这些颜色,打印出来。我没有任何其他的例子......我很抱歉我的英语不好。

编辑2: 好的,所以对我来说新的解决方案是获取 name == lenny linux 的整个文档(就像我的代码中的第一次一样),然后使用像 json-simple 这样的外部 JSON 解析器解析这个文档。好吧,也许那不是最好的解决方案,因为最好的解决方案是在没有其他库的情况下仅使用 mongolib 来获取数组中的内容...但是可以正常工作:) 如果有人知道更简单的方法,只需将其发布在这里。谢谢。

【问题讨论】:

  • 如果我这样做,我会取回包含 id、name、gender 和所有内容的整个文档。但我只想获取数组中的名称。所以 System.out.print(myFunctionToReadComputersFrom("lenny linux") 应该打印出:computer, computer2, ...
  • 这就是 mongodb 的工作原理,它存储文档并让您查询文档。如果您想从文档中获取一条信息,则必须将其提取出来。
  • 所以我得到了一个很大的文档,因为我只需要数组部分,所以我必须构建一个正则表达式(或其他东西?)来获取数组中的内容?
  • 您不必获取整个文档,您可以有选择地选择要返回的字段。请记住,您是决定文档架构的人,那么如果您只需要一两个字段,为什么还要创建一个巨大的文档呢?
  • 挑选字段?我想我错过了一些东西,你能举个例子吗? ^^

标签: java mongodb nosql


【解决方案1】:

如果我想从 mongodb 中删除一些东西怎么办 大批?与删除普通文档不同。

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

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

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

【讨论】:

    【解决方案2】:

    当进入包含对象(命名元素)的数组时,您希望使用点表示法进入数组。

    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

    【讨论】:

    • 对不起,我不明白,真的。 db.myCol.find() 应该如何工作?我什至不知道数组中有什么。我不能写 find(computers, name) 因为我不知道阵列内的计算机的名称。这就是为什么我想阅读整个数组。
    • 花点时间学习 [MongoDB 教程mongodb.org/display/DOCS/Tutorial] 不会花很长时间,您会更好地了解文档的(或可以)结构,以及如何搜索并找到你想要的。
    【解决方案3】:

    因为我在 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<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())s 来了解这个解决方案,以了解我需要转换哪些类。

    【讨论】:

      【解决方案4】:

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

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

      现在您可以使用 Perl 数组中的所有颜色。

      享受吧!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-09
        • 2017-08-15
        • 2012-11-07
        • 1970-01-01
        • 2020-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多