2016-02-26 1 views
1

Я просто хочу, чтобы добавить новое поле через $project трубопровода и пусть другие свойства проскочить для дальнейшей обработки, я знаю, что вы можете сделать это:

db.people.aggregate([ 
    {$project: {name: 1, address: 1, birth_month: {$month: "$birthdate"}}} 
]) 

Но все более и более сложным документом, у меня есть большая трудность написать 20 ++ имя поля в $project. Могу ли я просто добавить поле через агрегацию трубопровода таким образом, что я не имею к указанной другой области один за другим, что-то вроде

db.people.aggregate([ 
    {$appendField: {birth_month: {$month: "$birthdate"}}} 
]) 
+0

в этом случае Dont добавить 20+ поля, а положить, что поле в проекте, который вы не хотите {$ Проекта: {имя: 0}} в этом случае она будет выбирать все поля, кроме имени. –

+0

Я думаю, что вы неправильно поняли, я хочу сохранить исходный документ со всеми его полями в целости, но с дополнительным полем (birth_month) – DennyHiu

+0

.... и без необходимости писать другие имена полей в $ project – DennyHiu

ответ

1

Наконец, я был в состоянии решить эту проблему. Просто прочитайте старый пост здесь (MongoDB $project: Retain previous pipeline fields, благодаря @Johnny HK). Вот мое решение (Монго 2.6 или более поздняя версия):

db.people.aggregate([ 
    {$project: {doc: "$$ROOT", birth_month: {$month: "$birthdate"}}} 
    {$group: {_id: "$doc.gender"} } <-- here you can use fields of the original doc via $doc 
]) 
Смежные вопросы