搜索mongodb中数组元素的查询

时间:2015-05-07 10:46:15

标签: mongodb mongodb-query mongodb-java

我是mongodb的新手并且还在学习它,所以我的问题可能很幼稚,所以请耐心等待:) 我在mongodb中只有一个json对象,看起来像这样。

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"
        }
    ]
}

实际上只有1个描述应该已经返回,因为匹配的对象与关键的www.pqr.com只有一个。我的查询有什么问题?我在这里遗漏了什么?

我已经尝试过问题Retrieve only the queried element in an object array in MongoDB collection,但使用提到的解决方案只会返回一个对象/第一个匹配

1 个答案:

答案 0 :(得分:3)

使用以下聚合管道,应该能够提供所需的结果:

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"
        }            
    }
])