2015-07-20 4 views
2

Рассмотрите пример MongoDB zip codes aggregationdata set. Каждый документ в коллекции выглядит следующим образом:Как преобразовать коллекцию MongoDB в объект, привязанный к значению элемента?

{ 
    "_id": "10280", 
    "city": "NEW YORK", 
    "state": "NY", 
    "pop": 5574, 
    "loc": [ 
    -74.016323, 
    40.710537 
    ] 
} 

Как превратить коллекцию в объект, где каждый ключ является значением поля и каждое значение является объектом в коллекции?

Например, данные два документа

{ "_id" : "01001", "city" : "AGAWAM", "loc" : [ -72.622739, 42.070206 ], "pop" : 15338, "state" : "MA" } 
{ "_id" : "01002", "city" : "CUSHMAN", "loc" : [ -72.51564999999999, 42.377017 ], "pop" : 36963, "state" : "MA" } 

как я трансформировать их в единый документ

{ 
    "01001": { "_id" : "01001", "city" : "AGAWAM", "loc" : [ -72.622739, 42.070206 ], "pop" : 15338, "state" : "MA" }, 
    "01002": { "_id" : "01002", "city" : "CUSHMAN", "loc" : [ -72.51564999999999, 42.377017 ], "pop" : 36963, "state" : "MA" } 
} 

?

Я пытаюсь выполнить команду оболочки MongoDB db.zips.aggregate({$project: { "$_id":"$$CURRENT"}}).pretty(), и я получаю сообщение об ошибке $expressions are not allowed at the top-level of $project.

Я также попытался с помощью MapReduce с помощью команды db.zips.mapReduce(function(){emit(this._id, this)},function(k,v){}, {out:"stuffs"}) но что, не удивительно, что только производит (с db.stuffs.find())

{ "_id" : "01001", "value" : { "_id" : "01001", "city" : "AGAWAM", "loc" : [ -72.622739, 42.070206 ], "pop" : 15338, "state" : "MA" } } 
{ "_id" : "01002", "value" : { "_id" : "01002", "city" : "CUSHMAN", "loc" : [ -72.51565, 42.377017 ], "pop" : 36963, "state" : "MA" } } 

ответ

1

Вы можете использовать метод курсора forEach() итерировать find() курсор и доступ документы, которые затем можно добавить к переменной объекта, как показано в следующем примере с двумя документами:

var obj = {}; 
var iterator = function(doc){ 
    obj[doc._id] = doc; 
} 
db.collection.find({}).forEach(iterator); 
printjson(obj); 

Выход

{ 
    "01001" : { 
     "_id" : "01001", 
     "city" : "AGAWAM", 
     "loc" : [ 
      -72.622739, 
      42.070206 
     ], 
     "pop" : 15338, 
     "state" : "MA" 
    }, 
    "01002" : { 
     "_id" : "01002", 
     "city" : "CUSHMAN", 
     "loc" : [ 
      -72.51565, 
      42.377017 
     ], 
     "pop" : 36963, 
     "state" : "MA" 
    } 
} 
+1

Спасибо, @chridam. Я искал способ только для запросов, без курсора. Я должен был быть более конкретным в моем вопросе. –

+0

@MatthewAdams, пожалуйста, используйте [$ unwind] (https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/) –

Смежные вопросы