というユーザーというコレクションがあり、埋め込みドキュメントメッセージが含まれています。SpringデータMongoDB集約に巻き戻し、一致、ソート&グループが含まれます
{
"_id" : ObjectId("58e09daa192216e39fd85433"),
"userId" : "user123",
"message" : [
{
"messageId" : "5277941e-9d84-46c3-b927-ef33abbf35f2",
"dateCreated" : 1491115000,
"body" : "howdy?",
"type" : "text"
},
{
"messageId" : "c2ce0480-bc0d-4393-89d4-27174d323b98",
"dateCreated" : 1491119000,
"body" : "i've problem with my account. can you help?",
"type" : "text"
},
{
"messageId" : "45b2593c-a960-4066-8723-db2531dd8bab",
"dateCreated" : 1491100000,
"body" : "this is urgent",
"type" : "text"
}
]
}
私の目標は、埋め込まれた文書dateCreatedキーに基づいてメッセージを並べ替えることである:埋め込まれた文書メッセージは、以下のようにメッセージオブジェクトの配列が含まれています。私は春のデータのMongoDBにこのMongoのクエリを変換する必要があります。
db.user.aggregate(
{$unwind: "$message"},
{$match: {userId: "user123"}},
{$sort: {"message.dateCreated": 1}},
{$group: {_id: "$_id", "message": {"$push": "$message"}}})
私は以下のコードを試してみましたが、まだエラーを取得しました:
AggregationOperation unwind = Aggregation.unwind("message");
AggregationOperation match = Aggregation.match(Criteria.where("userId").in("user123"));
AggregationOperation sort = Aggregation.sort(Direction.ASC, "message.dateCreated");
AggregationOperation group = Aggregation.group("userId", "message");
Aggregation aggregation = Aggregation.newAggregation(unwind, match, sort, group);
AggregationResults<User> groupResults = mongoTemplate.aggregate(aggregation, User.class, User.class);
エラー:
はインスタンス化に失敗しました[ java.util.List]:指定されたクラスはインタフェースです
Userクラス:
@Document(collection="user")
public class User {
@Id
private String id;
private String userId;
@Field("message")
@DBRef
private List<Message> message;
//constructor, getter, setter
}
Messageクラス:
@Document
public class Message {
private String messageId;
private long dateCreated;
private String body;
private String type;
//constructor, getter, setter
}
ヒント:
私の研究に基づいて、私はGroupOperationBuilderグループ= Aggregation.groupを(使用する必要があることを確信しています"userId")。push( "message")しかし、AggregationResultsは私がmongoTemplate.aggregate()にそれを使用することを許可しないので、これをどのように進めるか分かりません。