【问题标题】:search query on array elements in mongodb搜索查询MongoDB中的数组元素
【发布时间】:2015-07-17 21:28:02
【问题描述】:

我是 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,但使用提到的解决方案只会返回一个对象/第一个匹配项

【问题讨论】:

  • @ Famousgarkin 是的,我试过了,但它只返回第一个匹配的元素。因此,如果我将查询更改为其他内容并且如果对象有多个匹配项,那么它将返回第一个匹配的对象
  • 同意,接受的解决方案不是很有用。查看其他的通用解决方案,例如使用带有 $unwind$redact 的聚合框架。

标签: mongodb mongodb-query mongodb-java


【解决方案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"
        }            
    }
])

【讨论】:

  • 查看代码(我还没有执行)我猜它只会返回第一次出现的 url "www.adf.com" 如果给定的 url 出现多次怎么办。跨度>
  • @Harshawardhan 你说得对,我需要更改组 ID 以包含两个字段,以便按 URL 和描述分组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 2018-05-06
相关资源
最近更新 更多