Чтение массива в mongodb? - PullRequest
       5

Чтение массива в mongodb?

3 голосов
/ 22 января 2012

Привет, у меня проблемы с массивами в 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 (как в первый раз в моем коде), а затем проанализировать этот документ с помощью внешнего анализатора JSON, например json-simple .Ну, может быть, это не лучшее решение, потому что лучшим решением было бы получить материал в массиве без других библиотек, просто используя mongolib ... но хорошо, он работает :) Если кто-то знает более простой способ, просто опубликуйте его здесь.Спасибо.

Ответы [ 4 ]

1 голос
/ 22 января 2012

При достижении массива с объектами (именованными элементами) вы хотите использовать точечную нотацию для доступа к массиву.

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

1 голос
/ 22 января 2012

А также, что если я хотел бы удалить что-то из массива mongodb?Это не то же самое, что удалить обычный документ.

http://www.mongodb.org/display/DOCS/Updating объясняет 2 способа:

  • $ set: заменить текущий массивс новым (извлечение предыдущего массива, удаление одного или двух элементов и обновление с помощью $ set)

  • db.users.update({name : "lenny linux"}, {$pull : { computers : { name : "computer2" } }}, false, false) для удаления всех элементов из массиваcomputers, которые имеют name 'computer2'.

0 голосов
/ 10 августа 2014

Вопрос, который он задает, состоит в том, как вернуть ВСЕ элементы, найденные в массиве, хранящемся в коллекции Mongo, не зная точно, сколько или каких этих элементов может быть. Вы не выполняете запрос к известному значению, а просто запрашиваете дамп того, что находится в массиве Mongo. Например, если имя вашего массива Mongo - «colors», просто сделайте следующее:

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

Теперь у вас есть все цвета в массиве Perl для игры.

Наслаждайтесь!

0 голосов
/ 16 января 2014

Поскольку я имел дело с этой проблемой на 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, чтобы узнать, какие классы мне нужно было сотворить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...