поисковый запрос по элементам массива в mongodb

Я новичок в mongodb и все еще изучаю его, поэтому мой вопрос может быть наивным, поэтому, пожалуйста, потерпите его :) У меня есть только один объект json в mongodb, который выглядит так.

объект json

{
    "URLStore": [
        {
            "description": "adf description",
            "url": "www.adf.com"
        },
        {
            "description": "pqr description",
            "url": "www.pqr.com"
        },
        {
            "description": "adf description",
            "url": "www.adf.com"
        }
    ]
}

Мне нужно запросить описание для URL-адреса, который соответствует заданному вводу. например здесь www.adf.com. У меня есть код, который запрашивает mongodb

запрос mongodb

BasicDBObject whereQuery = new BasicDBObject();
whereQuery.put("URLStore.url","www.pqr.com");
BasicDBObject fields=new BasicDBObject("URLStore.description", "");
cursor = collection.find(whereQuery,fields);

но результат примерно такой

{
    "_id": {
        "$oid": "554b4046e4b072dd9deaf277"
    },
    "URLStore": [
        {
            "description": "pqr description"
        },
        {
            "description": "adf description"
        },
        {
            "description": "adf description"
        }
    ]
}

На самом деле должно было вернуться только одно описание, так как соответствующие объекты с ключом www.pqr.com только одно. Что не так с моим запросом? м я что-то пропустил?

Я уже пробовал вопрос Получить только запрошенный элемент в массиве объектов в коллекции MongoDB, но при использовании упомянутого там решения будет возвращен только один объект/первое совпадение


person nishi    schedule 07.05.2015    source источник
comment
возможный дубликат Получить только запрошенный элемент в массиве объектов в коллекции MongoDB   -  person famousgarkin    schedule 07.05.2015
comment
@famousgarkin да, я пробовал, но он возвращает только первый совпадающий элемент. Итак, если я изменил свой запрос на что-то другое, и если объект имеет более одного совпадающего элемента, он вернет первый совпадающий объект.   -  person nishi    schedule 07.05.2015
comment
Согласен, принятое решение не очень полезно. Ознакомьтесь с другими для универсального решения, например, с использованием платформы агрегации с $unwind или $redact.   -  person famousgarkin    schedule 07.05.2015


Ответы (1)


Используйте следующий конвейер агрегации, который должен дать вам желаемые результаты:

db.collection.aggregate([
    {
        "$match": {
            "URLStore.url": "www.adf.com"
        }
    },
    {
        "$unwind": "$URLStore"
    },
    {
        "$match": {
            "URLStore.url": "www.adf.com"
        }
    },
    {
        "$group": {
            "_id": {
                   "url": "$URLStore.url",
                   "description": "$URLStore.description"
            }
        }
    },
    {
        "$project": {
            "_id": 0,
            "description": "$_id.description"
        }            
    }
])
person chridam    schedule 07.05.2015
comment
Глядя на код (я его не выполнял), я предполагаю, что он вернет только первое вхождение URL-адреса www.adf.com, что если существует более одного вхождения данного URL-адреса. - person Harshawardhan; 07.05.2015
comment
@Harshawardhan Вы правы, мне нужно изменить идентификатор группы, чтобы он включал оба поля, чтобы он группировался по URL-адресу и описанию. - person chridam; 07.05.2015