4

пусть у меня есть модель документа, как показано нижеМонго DB различных значений группы в массиве объектов

{ 
"_id" : "QggaecdDWkZzMmmM8", 
"features" : [ 
    { 
     "language" : "en", 
     "values" : [ 
      { 
       "name" : "feature 1", 
       "values" : [ 
        "test", 
        "best" 
       ] 
      }, 
      { 
       "name" : "feature2", 
       "values" : [ 
        "guest", 
        "nest" 
       ] 
      } 
     ] 
    } 
} 

Теперь мне нужно запустить запроса с возвращением уникальное имя и значение пары функций. как документ имеет название featues 1 с «тестом» и лучшими ценностями, другой документ имеет один и тот же ключ (функция 1 с другим значения, т.е. «гостя»), так что результат будет

name: featuer 1 
values: [test, best and guest] 

до сих пор я пытался следующий запрос, но возвращать ошибку в конце

db.getCollection('products').aggregate(
{$unwind: '$features'}, 
{$group: 
{_id: "$features.values.name"}, 
name: {$addToSet: '$name'} 
}) 

сообщение об ошибке

исключения: объект спецификации этапа трубопровода должен содержать ровно одно поле

+0

Ваше описание является, но громоздки, но я думаю, что II получил свой результат, пожалуйста, проверьте мой ответ. – sergiuz

ответ

3

Поле имени должно быть внутри группового этапа, поэтому у вас есть ошибка.

Попробуйте этот запрос:

db.getCollection('products').aggregate([ 
    { 
     $unwind: '$features' 
    }, 
    { 
     $unwind: '$features.values' 
    }, 
    { 
     $unwind: '$features.values.values' 
    }, 
    { 
     $group: { 
      _id: "$features.values.name", 
      values: {$addToSet: '$features.values.values'} 
     }, 
    } 
]) 

Результат:

{ "_id" : "feature2", "values" : [ "nest", "guest" ] } 
{ "_id" : "feature 1", "values" : [ "best", "test" ] } 
+1

Я думаю, он просит, чтобы он просто хотел использовать функции «1». Так что ваш ответ правильный, просто нужно добавить '{ $ матч: {'features.values.name': 'feature 1'} }' –

+0

hmm, посмотрим его обновление, чем я исправлю, если это необходимо. Tx. – sergiuz

+1

@SergiuZaharie благодарит только одну вещь, она возвращает все языковые результаты, и я хочу только результаты «en», я также пробовал »{$ match: {'features.language': 'en'}}," но не удача –