$проект не работает должным образом

У меня есть коллекция в монго следующим образом:

{
"_id" : ObjectId("5490b272f315dce7077204af"),
"Date" : ISODate("2014-10-19T04:00:00.000Z"),
"Type" : "Twitter",
"Entities" : [ 
    {
        "ID" : 2,
        "Name" : "test1",
        "Sentiment" : {
            "Value" : 19,
            "Neutral" : 1
        },
        "Quality" : {
            "Value" : 0.1,
            "Low" : 1
        },
        "Intensity" : {
            "Value" : 0,
            "Low" : 1
        },
        "Happiness" : {
            "Value" : 0.5,
            "Medium" : 1
        }
    }, 
    {
        "ID" : 4,
        "Name" : "test1",
        "Sentiment" : {
            "Value" : 10,
            "Neutral" : 1
        },
        "Quality" : {
            "Value" : 0.1,
            "Low" : 1
        },
        "Intensity" : {
            "Value" : 0,
            "Low" : 1
        },
        "Happiness" : {
            "Value" : 0.5,
            "Medium" : 1
        }
    }
]

}

Теперь я хочу сгруппировать все по дате и получить сумму Sentiment.Value, и у меня есть код Java, который работает отлично:

ArrayList<DBObject> andArray = andArrayEntityIdsEqualAndDateBetweenGraph(entityIds, startDate, endDate);
    DBObject where = new BasicDBObject("$match", new BasicDBObject("$and", andArray));
    DBObject unwind = new BasicDBObject("$unwind", "$Entities"); // "$unwind" converts object with array into many duplicate objects, each with one from array
    collectionG = db.getCollection("GraphDataCollection");
    DBObject groupFields = new BasicDBObject( "_id", "$Date");
   groupFields.put("value", new BasicDBObject( "$sum", "$Entities.Sentiment.Value"));
    DBObject groupBy = new BasicDBObject("$group", groupFields );
    DBObject sort = new BasicDBObject("$sort", new BasicDBObject("_id", 1));
    stages.add(where);
    stages.add(unwind);
    stages.add(groupBy);
    stages.add(sort);
    AggregationOutput output = collectionG.aggregate(stages);
    System.out.println(output.results());

И результат следующий:

[
{
    "_id": {
        "$date": "2014-10-19T04:00:00.000Z"
    },
    "value": 29
},
{
    "_id": {
        "$date": "2014-10-20T04:00:00.000Z"
    },
    "value": 20
},
{
    "_id": {
        "$date": "2014-10-21T04:00:00.000Z"
    },
    "value": 21
}

]

Теперь я хочу скрыть _id и показать только дату и значение, поэтому я изменил свой код на следующее:

DBObject where = new BasicDBObject("$match", new BasicDBObject("$and", andArray));
    DBObject unwind = new BasicDBObject("$unwind", "$Entities"); // "$unwind" converts object with array into many duplicate objects, each with one from array
    collectionG = db.getCollection("GraphDataCollection");
    DBObject groupFields = new BasicDBObject( "_id", "$Date");
   groupFields.put("value", new BasicDBObject( "$sum", "$Entities.Sentiment.Value"));
    DBObject groupBy = new BasicDBObject("$group", groupFields );
    DBObject sort = new BasicDBObject("$sort", new BasicDBObject("_id", 1));
    stages.add(where);
    stages.add(unwind);
    stages.add(groupBy);
    DBObject project = new BasicDBObject("_id",0);
     project.put("Date",1);
     project.put("value",1);
     project.put("Type",1);
     stages.add(new BasicDBObject("$project",project));
    stages.add(sort);
    AggregationOutput output = collectionG.aggregate(stages);
    System.out.println(output.results());

Теперь я ожидаю, что _id будет скрыт, но значение и дата будут видны, но я не знаю, почему вместо этого я получаю следующий результат:

[
{
    "value": 29
},
{
    "value": 21
},
{
    "value": 20
}

]

Кто-нибудь может помочь?


person Hamed Minaee    schedule 06.01.2015    source источник


Ответы (1)


Измените соответствующий объект project, чтобы исключить _id и проецировать поле _id как поле Date.

  DBObject project = new BasicDBObject("_id",0);
  project.put("Date","$_id");
  project.put("value",1);

Когда вы это сделаете,

 DBObject project = new BasicDBObject("_id",0);
 project.put("Date",1);
 project.put("value",1);
 project.put("Type",1);

project.put("Date",1) не действует, поскольку документы, которые переходят на стадию $project из стадии $group, не имеют поля Date, но имеют даты, выбранные в полях _id.

project.put("Type",1) недействителен, поскольку исходные документы имеют поле Type, но не документы, которые входят в стадию $project после их группировки.

person BatScream    schedule 06.01.2015
comment
Спасибо, вы решили мою проблему, просто быстрый вопрос: поскольку Date является форматом даты в монго, он возвращается следующим образом: Date: {$date: 2014-10-19T04:00:00.000Z} и когда я пытаюсь получить результат в java с помощью этот код: for (результат DBObject: output.results()) { System.out.println(result.get(Date).toString()); Я получаю дату, преобразованную следующим образом: вс, 19 октября, 01:00:00 ADT 2014, есть ли способ получить ее как оригинальную (2014-10-19T04:00:00.000Z)? - person Hamed Minaee; 06.01.2015
comment
@HamedMinaee Я мог бы ответить на это как часть этого комментария, но он немного широк. Простите за это. Если я включу это в свой ответ, это просто вырвется из контекста исходного вопроса. Не могли бы вы задать новый вопрос с этим. Это было бы полезно и другим, кто сталкивается с той же проблемой. - person BatScream; 06.01.2015
comment
@HamedMinaee - Но для этого вы можете использовать API форматирования даты, например simpledateformat. - person BatScream; 06.01.2015
comment
Конечно, исходный вопрос здесь, не могли бы вы взглянуть: :stackoverflow.com/questions/27803876/ - person Hamed Minaee; 06.01.2015
comment
Снова привет, BatScream, здесь есть вопрос, на котором я действительно застрял. Не могли бы вы взглянуть: stackoverflow.com/questions/28255100/ - person Hamed Minaee; 31.01.2015