2015-03-03 4 views
2

Мне нужны продукты группы по модели. Каждый продукт имеет модельное поле - DBRef для коллекции моделей. Я пытался использовать этот совокупный запрос, но есть ошибки FieldPath field names may not start with '$'.Группа Mongodb от dbref field

Aggregation запрос:

db.Products.aggregate([ 
    { $project: { _id: 0, model: 1, isActive: 1 } }, 
    { $group: { _id: "$model.$id", actives: { $push: "$isActive" } }} 
]); 

Пример документа продукта:

{ 
    _id: ObjectId("54f48610e31701d2184dede5"), 
    isActive: true, 
    model: { 
     $db: "database", 
     $ref: "Models", 
     $id: ObjectId("....") 
    } 
} 

ответ

3

Там раньше раздел в руководстве, что в явной форме заявила, что DBRef не поддерживается в рамках агрегации наряду с различными другими типами BSON.

старый канал чтения, как показано в этом google groups archive сообщение:

Предупреждение: Трубопровод не может работать на значения следующих типов: Binary, Symbol, MinKey, MaxKey, DBRef, Code и CodeWScope ,

Это может все еще быть где-то там, но я просто не могу найти его прямо сейчас :)

Кроме того, как aluded в этой ветке сообщений является то, что в стороне от этого не поддерживается в рамках агрегации, то другой вариант (и только реальная опция для агрегации) заключается в том, чтобы вместо этого использовать метод mapReduce. В качестве оболочки, например:

db.Products.mapReduce(
    function() { 
     emit(this.model.$id, { "actives": [this.isActive] }); 
    }, 
    function(key,values) { 
     var result = { "actives": [] }; 
     values.forEach(function(value) { 
      value.actives.forEach(function(active) { 
       result.actives.push(active); 
      }); 
     }); 
    }, 
    { "out": { "inline": 1 } } 
) 

Это не выглядит так хорошо, из-за произвольной { "_id": "", "value": { } } структуры результатов MapReduce, но он позволяет рода агрегации, которую вы ищете.

Существует также ссылка на этот вопрос JIRA: SERVER-14466, но я не продержался бы много движения на этом фронте.

Таким образом, вы можете использовать mapReduce, но было бы желательно отказаться от использования DBRef и определить альтернативную форму «справочных ссылок» либо вложения «коллекции», так и «базы данных» или полагаться на внешнее определение таких вещей в вашем схемы приложения, в зависимости от ваших потребностей. Пока вы соблюдаете те же правила, вы можете использовать структуру агрегации для чего-либо с действительными именами свойств.

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