2015-10-25 2 views
1

I имеют следующую структуру документа:

{ 
name: "some user name", 
    cvs: [{ 
    title: 'Cv title' 
    technologies: [ 
     { 
     text: 'JavaScript', 
     main: true 
     }, 
     { 
     text: "AngularJs", 
     main: true 
     } 
    ] 
    }] 
} 

Когда я делаю следующее агрегацию (есть только один документ в БД):

db.users.aggregate([ 

{"$unwind": "$cvs"}, 
{"$unwind": "$cvs.technologies"}, 
{"$match": { 
    "cvs.isBlocked": false, 
    "cvs.moderated": true, 
    "cvs.isVisible": true, 
    "cvs.technologies.main": true 
    } 
}, 
    {"$project": { 
     "type": "$cvs.occupationType", 
     "proficiency": "$cvs.proficiencyLevel", 
     "_id": "$cvs._id", 
     "title": "$cvs.title", 
     "technologies": "$cvs.technologies.text", 
    }} 
]) 

Я получаю массив из двух элементов (но это тот же документ) только потому, что есть две технологии, соответствующие

"cvs.technologies.main": true 

[ 
    { 
     "_id" : ObjectId("5629e813279b62fe075fbd4c"), 
     "type" : "Frontend", 
     "proficiency" : "Middle", 
     "title" : "Frontend developer", 
     "technologies" : "JavaScript", 
    }, 
    { 
     "_id" : ObjectId("5629e813279b62fe075fbd4c"), 
     "type" : "Frontend", 
     "proficiency" : "Middle", 
     "title" : "Frontend developer", 
     "technologies" : "Ruby", 
    } 
] 

Как я могу получить этот результат ?:

[ 
    { 
     "_id" : ObjectId("5629e813279b62fe075fbd4c"), 
     "type" : "Frontend", 
     "proficiency" : "Middle", 
     "title" : "Frontend developer", 
     "technologies" : ["JavaScript", "Ruby"], 
    } 
] 
+0

Пожалуйста, покажите пример документ с такой же структурой, как и документы в вашей коллекции. Я думаю, что есть лучший способ сделать это. – styvane

ответ

1

Выполните следующий трубопровод, который помещает дополнительные $match и $group трубопроводные шаги для того, чтобы optimize агрегации трубопровода (размещение $match трубопровода до $unwind для отфильтровывания нежелательных документов, проходящих по трубопроводу) получить желаемый результат (используя $group оператор сгруппировать документы по заданным полям, используйте $push аккумулятор для создания массива):

db.users.aggregate([ 
    { 
     "$match": { 
      "cvs.isBlocked": false, 
      "cvs.moderated": true, 
      "cvs.isVisible": true, 
      "cvs.technologies.main": true 
     } 
    }, 
    {"$unwind": "$cvs"}, 
    {"$unwind": "$cvs.technologies"}, 
    { 
     "$match": { 
      "cvs.isBlocked": false, 
      "cvs.moderated": true, 
      "cvs.isVisible": true, 
      "cvs.technologies.main": true 
     } 
    }, 
    { 
     "$group": { 
      "_id": { 
       "type": "$cvs.occupationType", 
       "proficiency": "$cvs.proficiencyLevel", 
       "_id": "$cvs._id", 
       "title": "$cvs.title"    
      }, 
      "technologies": { 
       "$push": "$cvs.technologies.text" 
      } 
     } 
    }, 
    { 
     "$project": { 
      "type": "$_id.type", 
      "proficiency": "$_id.proficiency", 
      "_id": "$_id._id", 
      "title": "$_id.title", 
      "technologies": 1, 
     } 
    } 
]) 
+0

Это делает трюк! Но в результате отсутствуют «тип» и «умение». Только название и технологии есть – user2814599

+0

@ user2814599 Обновленный ответ, опечатка. Должно работать сейчас :-) – chridam

+1

Я должен был проверить, чтобы найти опечатку, прежде чем спрашивать !. Оно работает! Благодаря! – user2814599

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