агрегация mongo: - протолкнуть все поля с помощью Spring

если у меня есть коллекция книг: -

{author: "tolstoy", title:"war & peace", price:100, pages:800}
{author: "tolstoy", title:"Ivan Ilyich", price:50,  pages:100}

и если я хочу получить такой результат после их группировки по автору: -

{ author: "tolstoy",
   books: [
      {author: "tolstoy", title:"war & peace", price:100, pages:800}
      {author: "tolstoy", title:"Ivan Ilyich", price:50,  pages:100}
]
}

используя сырые запросы mongo, я могу сделать что-то вроде этого: -

{$group: {
 _id: "$author",
 books:{$push: {author:"$author", title:"$title", price:"$price", pages:"$pages"}},
}}

Но как мне это сделать с помощью Spring, я пробовал что-то вроде этого: -

 private GroupOperation getGroupOperation() {
    return group("author").push("title").as("title").push("price").as("price").push("pages").as("pages");
}

but this does not seem to work. Any help would be appreciated.

ОБНОВЛЕНИЕ: - Я использовал решение, как в ссылке, предложенной @Veeram, и оно отлично работает, но я столкнулся с другой проблемой, когда проецирую его. У меня есть класс проекции, который выглядит так: -

public class BookSummary{

private String author;

private List<Book> bookList;
  //all getters and setters below
}    

Групповой метод выглядит так: -

 private GroupOperation getGroupOperation() {
    return group("author").push(new BasicDBObject("id","$_id").append("title","$title").append("pages","$pages").append("price","$price")).as("bookList");
}

метод проецирования выглядит так: -

private ProjectionOperation getProjectOperation() {
    return project("author").and("bookList").as("bookList");
}

и последняя операция агрегирования: -

mongoTemplate.aggregate(Aggregation.newAggregation(groupOperation,projectionOperation), Book.class, BookSummary.class).getMappedResults();

Однако это дает результат: -

[
{
    "author": null,
    "bookList": [
        {
            "id": null,
            "title": "title1",
            "pages": "100",
            "price":"some price"
        },
        {
            "id": null,
            "title": "title2",
            "pages": "200",
            "price":"some price"
        }
    ]
}
]

Почему автор и идентификатор здесь равны нулю? Любая помощь будет оценена


person Rasmus    schedule 04.01.2018    source источник
comment
Возможный дубликат MongoDB $ aggregate $ push в данных Java Spring   -  person s7vr    schedule 04.01.2018
comment
Спасибо @Veeram +1. Это определенно помогло. Обновили вопрос. Не могли бы вы взглянуть   -  person Rasmus    schedule 04.01.2018
comment
Взгляните на stackoverflow.com/q/42814325/2683814, чтобы вставить все поля.   -  person s7vr    schedule 04.01.2018
comment
в то время как у этого есть все поля, поле автора, с помощью которого происходит группа, по-прежнему пустое @Veeram   -  person Rasmus    schedule 04.01.2018
comment
Что-то не так в проекции, которую я делаю?   -  person Rasmus    schedule 04.01.2018
comment
Да, проекция должна быть project("bookList").and("author", "_id")   -  person s7vr    schedule 04.01.2018
comment
отлично поработали! желаю, чтобы все это можно было принять в качестве ответа. Большое спасибо!   -  person Rasmus    schedule 04.01.2018


Ответы (1)


Вместо этого на этапе проекта вы должны использовать _id.

private ProjectionOperation getProjectOperation() {
    return project("_id").and("bookList").as("bookList");
}
person user1527086    schedule 15.04.2020