0

В настоящее время я сталкиваюсь с проблемой обработки документов mongodb и получения полевых значений. Например, скажем, Монго содержит следующие документы:Как обрабатывать документы mongo и получать полевые данные в массиве

[ 
    { "name": "test1", "age": 20, "gender": "male" }, 
    { "name": "test2", "age": 21, "gender": "female" }, 
    { "name": "test3", "age": 30, "gender": "male"} 
] 

Ожидаемый вывод:

{ 
    "name": ["test1","test2","test3"], 
    "age": [20,21,30], 
    "gender": ["male","female", "male"] 
} 

Можно ли извлекать данные из Монго в вышеуказанном формате? Я не хочу писать некоторые функции javascript для обработки этого. Глядя на получение данных с помощью функций mongo вместе с поиском запроса.

ответ

3

Вы должны были бы использовать структуру агрегации, чтобы получить желаемый результат. Запустите следующий конвейер агрегации, который фильтрует документы в коллекции, входящей в конвейер для группировки, с использованием оператора . Это похоже на фильтр запросов find().

db.collection.aggregate([ 
    { "$match": { "age": { "$gte": 20 } } }, // filter on users with age >= 20 
    { 
     "$group": { 
      "_id": null, 
      "name": { "$push": "$name" }, 
      "age": { "$push": "$age" }, 
      "gender": { "$push": "$gender" } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "name": 1, 
      "age": 1, 
      "gender": 1 
     } 
    } 
]) 

Пример вывод

{ 
    "name": ["test1", "test2", "test3"], 
    "age": [20, 21, 30], 
    "gender": ["male", "female", "male"] 
} 

В приведенном выше трубопроводе, первый шаг трубопровода является $match оператора, который аналогичен п SQL, где. В приведенном выше примере фильтруются входящие документы на поле age (возраст больше или равен 20).

Следует отметить, что при выполнении трубопровода MongoDB соединяет операторы друг с другом. «Pipe» здесь означает значение Linux: выход оператора становится входом следующего оператора. Результатом каждого оператора является новая коллекция документов. Так Монго выполняет предыдущий трубопровод следующим образом:

collection | $match | $group | $project => result 

Следующий этап трубопровода Оператор $group. Внутри трубопровода вы группируете все отфильтрованные документы, в которых вы можете указать значение _idnull для расчета накопленных значений для всех входных документов в целом. Используйте доступные accumulators, чтобы вернуть желаемую совокупность в сгруппированных документах. Оператор аккумулятора $ push используется в этой операции группировки, потому что он возвращает массив значений выражений для каждой группы.

Аккумуляторы, используемые в $group стадии поддерживают свое состояние (например, итоговые данные, максимумы, минимумы и связанные с ними данные), как документы, по мере прохождения трубопровода.

Чтобы получить документы с нужной области, оператор $project, который похож на SELECT в SQL используется для переименования имен полей и выбора/отмены выбора полей, которые будут возвращены, из сгруппированных полей. Если вы укажете 0 для поля, он НЕ будет отправлен в конвейер для следующего оператора.

+0

На самом деле '$ project' здесь не нужен. Еще одно поле в документе - это то, с чем можно жить. – styvane

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