2017-02-21 19 views
0

Ниже приведены мои 4 документа с точной структурой в коллекции монго, у меня есть такие 276 документов в моей коллекции. Я просто хочу получить отдельные «Имена кампаний» из моей коллекции.Получите отчетливый конкретный элемент из массива документов mongo в коллекции mongo

Значения и массивы заголовка являются один к одному сопоставляются:

{ 
    "_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 пожинает дважды, поэтому я хочу, чтобы она появилась только один раз, как упоминалось выше, ,

Пожалуйста, помогите!

+0

Что ожидаемый выход здесь? – styvane

+0

Ожидаемый результат будет первым элементом массива значений из каждого документа в моей коллекции, но они должны быть разными. Не хочу дублирования. Это может быть в любой форме, я не хочу какого-либо конкретного формата, я просто хочу, чтобы мои требуемые данные. –

+0

Пожалуйста, используйте ссылку для редактирования по вашему вопросу, чтобы сообщить, что информация – styvane

ответ

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}} 
) 
+0

Спасибо Алекс, это выглядит логичным для меня, но его дать мне Ошибка: карты уменьшить не удалось: { \t «ОК»: 0, \t «ErrMsg»: «уменьшить -> множественным пока не поддерживается», \t «код ": 10075, \t" codeName ":" Location10075 " } Извините, что я новичок в mongo. –

+2

Ах, справедливо. Это было слишком просто проверить =). Я обновил ответ. Вас в основном интересует уникальный _id в приведенном массиве. –

+1

Спасибо, Алекс. Это потрясающе. –

1

Этот ответ зависит от фиксированного индекса для значения вы ищете во всех документах.

Предположим, что вы всегда заботитесь о вводе данных в правильное положение как в Headers, так и в Values.

Для Campaign Name индекс 0 в Values массив

Вы можете уйти с ниже запроса

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

Если индекс названия кампании не является фиксированным, но динамическим, значит, сокращение карты - единственный способ сделать это? –

+0

может быть. просто из любопытства обновляет вашу структуру вариант для вас? – Veeram

+0

Да, я планирую изменить его ... Можете ли вы дать мне хорошие предложения? –