从mongo集合中的mongo文档数组中获取独特的特定元素

时间:2017-02-21 13:02:26

标签: mongodb mongodb-query aggregation-framework

下面给出了我在mongo集合中具有确切结构的4个文档,我的集合中有276个文档。我只想获得不同的"广告系列名称"来自我的收藏。

值和标头数组是一对一映射的:

{
    "_id" : "ObjectId("58a4adb4ef2bf41444c79e5b1"),
    "Status" : false,
    "Headers" : [ 
        "Campaign Name", 
        "Ad Set Name", 
        "Ad Name", 
        "URL Tags", 
    ],
    "Values" : [ 
        "Campaign 1", 
        "Adset 1", 
        "Ad 1", 
        "url tag1" 
    ]
}

,
{
        "_id" : "ObjectId("58a4adb4ef2bf41444c79e5b2"),
        "Status" : false,
        "Headers" : [ 
            "Campaign Name", 
            "Ad Set Name", 
            "Ad Name", 
            "URL Tags", 
        ],
        "Values" : [ 
            "Campaign 2", 
            "Adset 2", 
            "Ad 2", 
            "url tag 2" 
        ]
    },
{
        "_id" : "ObjectId("58a4adb4ef2bf41444c79e5b3"),
        "Status" : false,
        "Headers" : [ 
            "Campaign Name", 
            "Ad Set Name", 
            "Ad Name", 
            "URL Tags", 
        ],
        "Values" : [ 
            "Campaign 2", 
            "Adset 2", 
            "Ad 2", 
            "url tag 2" 
        ]
    },
{
        "_id" : "ObjectId("58a4adb4ef2bf41444c79e5b4"),
        "Status" : false,
        "Headers" : [ 
            "Campaign Name", 
            "Ad Set Name", 
            "Ad Name", 
            "URL Tags", 
        ],
        "Values" : [ 
            "Campaign 4", 
            "Adset 4", 
            "Ad 4", 
            "url tag 4" 
        ]
    }

需要输出:

Campaign 1,Campaign 2,Campaign 4

由于广告系列2正在收获两次,所以我希望它只出现一次如上所述。

请帮忙!!

2 个答案:

答案 0 :(得分:3)

此答案取决于您在所有文档中查找的值的固定索引。

因此,假设您始终负责在HeadersValues中的正确位置插入数据。

对于Campaign NameValues数组

中的索引为0

您可以使用以下查询

db.collection.distinct("Values.0").

答案 1 :(得分:2)

使用mapReduce可以非常简单地完成:

db.collection.mapReduce(
    function(){
        for(var i = 0; i < this.Headers.length; i++) {
            if (this.Headers[i] === "Campaign Name" && i in this.Values) {
                emit(this.Values[i], 1);
            }
        }
    },
    function(header, values) {
            return 1
    },
    {out: {inline: 1}}
)