2016-12-26 3 views
0

MongoDB возвращает следующий JSON массив, когда мы извлекаем данные из коллекции «Статьи»Форматирование MongoDB результат

[{ 
    "_id": "id1", 
    "description": "Description for article", 
    "author": "publisher of article" 
}, { 
    "_id": "id2", 
    "description": "Description for article", 
    "author": "publisher of article" 
}, { 
    "_id": "id3", 
    "description": "Description for article", 
    "author": "publisher of article" 
}] 

Однако я хочу JSON в следующем формате

[{ 
    "id1": { 
     "_id": "id1", 
     "description": "Description for article", 
     "author": "publisher of article" 
    }, 
    "id2": { 
     "_id": "id2", 
     "description": "Description for article", 
     "author": "publisher of article" 
    }, 
    "id3": { 
     "_id": "id3", 
     "description": "Description for article", 
     "author": "publisher of article" 
    } 
}] 

Можно ли достичь такого результата, используя Запрос MongoDB?

+0

Зачем вам нужно форматировать его так? – ZippyV

+0

Чтобы получить результат непосредственно, указав ключ, вместо того, чтобы перебирать JSON –

ответ

0

Вы можете сделать это с помощью map reduce: функция

  • карта:

    var mapFunction = function() { 
        var obj = {}; 
    
        obj[this._id] = { 
    
         "_id": this._id, 
         "description": this.description, 
         "author": this.author 
    
        }; 
        emit(1,obj); 
    }; 
    
  • уменьшить функции:

    var reduceFunction = function(key, values) { 
    
        var reduced = {}; 
    
        var output_arr = []; 
    
        values.forEach(function(value) { 
         Object.keys(value).forEach(function(key) { 
          var obj = {}; 
          obj[key]=value[key]; 
          output_arr.push(obj); 
         }); 
        }); 
    
        reduced["data"] = output_arr; 
    
        return reduced; 
    
    }; 
    

Карта уменьшить запрос:

db.items.mapReduce(mapFunction, reduceFunction, { out: { inline: 1 } }) 

Вы можете получить результаты в results[0].value.data. Выход:

{ 
    "results" : [ 
     { 
      "_id" : 1, 
      "value" : { 
       "data" : [ 
        { 
         "id1" : { 
          "_id" : "id1", 
          "description" : "Description for article", 
          "author" : "publisher of article" 
         } 
        }, 
        { 
         "id2" : { 
          "_id" : "id2", 
          "description" : "Description for article", 
          "author" : "publisher of article" 
         } 
        }, 
        { 
         "id3" : { 
          "_id" : "id3", 
          "description" : "Description for article", 
          "author" : "publisher of article" 
         } 
        } 
       ] 
      } 
     } 
    ], 
    "timeMillis" : 11, 
    "counts" : { 
     "input" : 3, 
     "emit" : 3, 
     "reduce" : 1, 
     "output" : 1 
    }, 
    "ok" : 1 
} 
+0

Это можно сделать с помощью агрегации или проекта, так как этот запрос занимает много времени, когда я запускаю его для извлечения большого количества записей –

+0

Нет пока нет (mongo 3.4), возможно, в будущем выпуске см. https://jira.mongodb.org/plugins/servlet/mobile#issue/SERVER-5947 –