在mongo中查找\查询数组数组

时间:2013-12-24 16:12:34

标签: arrays mongodb find

如何实施以下内容: *找到data3的值,其中id =“ID1”和region =“RegionA”和indicator_id“= 1 *(结果应该是:”A“)

元素集合:

{
    "id" : "ID1",
    "data1" : 
    [ 
        {
            "region" : "RegionA",
            "data2" : [ 
                {
                    "indicator_id" : 1,
                    "data3" : "A"
                }, 
                {
                    "indicator_id" : 2,
                    "data3" : "B"
                }, 
                {
                    "indicator_id" : 3,
                    "data3" : "C"
                }, 
                {
                    "indicator_id" : 4,
                    "data3" : "D"
                }
            ]
        }, 
        {
            "region" : "RegionB",
            "data2" : [ 
                {
                    "indicator_id" : 5,
                    "data3" : "A"
                }, 
                {
                    "indicator_id" : 6,
                    "data3" : "B"
                }, 
                {
                    "indicator_id" : 7,
                    "data3" : "C"
                }, 
                {
                    "indicator_id" : 8,
                    "data" : "D"
                }
            ]
        }
    ]
}

不要使用$ where,因为它效率低下

以下作品但返回整个'RegionA'(这不是预期的结果)并使用'[0] .data1 [0] .data2 [0] .data3'来投影“A”:

db.elements.find({id:"ID1"},{data1 : { $elemMatch: { data2: {$elemMatch: { indicator_id:1}}}}})[0].data1[0].data2[0].data3

2 个答案:

答案 0 :(得分:0)

您好,您可以尝试以下

db.test1.find({id:"ID1",data1:{$elemMatch: { region:"RegionA"}}, "data1.data2.indicator_id":1 })
希望这就是你要找的东西。

答案 1 :(得分:0)

首先,你说得对,说数据模型可能不正确。 看起来你正试图保持SQL像表,只是嵌入关系作为子文档。 问题是您正在尝试深入查询这些子文档。 您需要的是将'$ elemMatch'运算符应用于子文档,但不支持此操作。 见https://jira.mongodb.org/browse/SERVER-831 即使它得到支持,查询也会过于复杂,而且您很难在这些数据上声明索引。

作为当前查询的替代方法,您可以使用聚合框架。

db.elements.aggregate([{"$match":{"id":"ID1"}},{"$unwind":"$data1"},{"$unwind":"$data1.data2"},{"$match":{"data1.region":"RegionA","data1.data2.indicator_id":1}},{"$project":{"answer":"$data1.data2.data3","_id":0}}]).result

[ { "answer" : "A" } ]

即使上述聚合查询有效并且可能适用于少量数据,我建议您查看需要执行的查询并相应地对数据建模。

例如,如果以上是您最重要的查询,您可能需要考虑为每个'data3'项目设置一个文档。在上面的聚合查询中运行2 $ unwind命令后,您的数据看起来就像您看到的文档:

    {
        "_id" : ObjectId("52caeb934c735353309cf068"),
        "id" : "ID1",
        "region" : "RegionA",
        "indicator_id" : 1,
        "data3" : "A"
    },
    {
        "_id" : ObjectId("52caeb934c735353309cf068"),
        "id" : "ID1",
        "region" : "RegionA",
        "indicator_id" : 2,
        "data3" : "B"
    },
    ...

要了解有关建模的更多信息,请观看MongoDB的演示文稿。 转到http://www.mongodb.com并搜索“演示数据建模”