Использование встроенных документов в весенней агрегации данных

У меня есть документ MongoDB, подобный этому примеру:

{
    "_id" : "A",
    "articleNumber" : "0123456",
    "shopDependentProperties" :
       { 
                    "shop" : "DE",
                    "foo" : "foo",
                    "bar" : "bar"
     }
}

и хотите вытащить свойства shopDependentProperties, чтобы получить следующий результат

{
    "_id" : "A",
    "articleNumber" : "0123456",
    "foo" : "foo",
    "bar" : "bar"
}

В MongoDB Shell я могу решить это следующим образом:

db.test.aggregate(
  [
    {
      $project:
        {       
          _id : "$_id",   
          articleNumber : "$articleNumber",
          foo:"$shopDependentProperties.foo",
          bar:"$shopDependentProperties.bar"
        }
    }
 ]
)

Но: в Spring Data MongoDB я не могу извлечь содержимое встроенного документа. Перепробовал много комбинаций, ничего не помогло. Например:

ProjectionOperation projection = Aggregation.project("_id");
projection.andExpression("shopDependentProperties.foo").as("foo");
projection.andExpression("shopDependentProperties.bar").as("bar");
System.out.println(projection.toDBObject(Aggregation.DEFAULT_CONTEXT));

проигнорирует материал shopDependentProperties.shop и просто распечатает

{ "$project" : { "_id" : 1}}

Какие-либо предложения?

Спасибо


person Shaa    schedule 19.09.2014    source источник


Ответы (2)


Не проверял это, но по состоянию на

http://docs.mongodb.org/manual/reference/operator/aggregation/project/

вы указываете включенные/исключенные поля следующим образом:

db.test.aggregate(
[
  {
    $project:
      {       
        _id : "$_id",
        articleNumber : 1,
        "shopDependentProperties.foo": 1,
        "shopDependentProperties.bar": 1
      }
  }

] )

Далее объясняется, как включить встроенные документы в результат проекции.

person angabriel    schedule 22.09.2014

Я знаю, как это сделать в MongoDB, проблема заключалась в том, чтобы сделать то же самое в Spring Data.

Но это работает так же, почему я не попробовал это раньше?

Решение:

ProjectionOperation project = Aggregation.project("brandName", "$shopDependentProperties.foo", "$shopDependentProperties.bar" );

person Shaa    schedule 22.09.2014