1

同じクエリでスライスとカウントを組み合わせる必要があります。その方法を説明しましょう。

私はコメントを配列内に彼の返信とともに保存するコレクションを持っています

{
    "_id" : ObjectId("5a6b14796ede6d5169ad68a7"),
    "_class" : "com.social.model.comment.FirstLevelComment",
    "contentId" : "5a12996de7e84e0001b93a91",
    "replies" : [ 
        {
            "_id" : ObjectId("5a6b151a6ede6d5169ad68b1"),
            "date" : ISODate("2018-01-26T11:46:34.202Z"),
            "text" : "Reply 1"
        }, 
        {
            "_id" : ObjectId("5a6b151d6ede6d5169ad68b2"),
            "date" : ISODate("2018-01-26T11:46:37.357Z"),
            "text" : "Reply 2"
        }, 
        {
            "_id" : ObjectId("5a6b15206ede6d5169ad68b3"),
            "date" : ISODate("2018-01-26T11:46:40.170Z"),
            "text" : "Reply 3"
        }, 
        {
            "_id" : ObjectId("5a6b15236ede6d5169ad68b4"),
            "date" : ISODate("2018-01-26T11:46:43.025Z"),
            "text" : "Reply 4"
        }, 
        {
            "_id" : ObjectId("5a6b15256ede6d5169ad68b5"),
            "date" : ISODate("2018-01-26T11:46:45.931Z"),
            "text" : "Reply 5"
        }
    ],
    "date" : ISODate("2018-01-26T11:43:53.578Z"),
    "text" : "This is the comment text"
}

すべての第 1 レベルのコメントは個別のドキュメントに保存されるため、コンテンツに属するすべてのコメントを取得するには、「contentId」フィールドで一致するクエリを作成する必要があります。

ただし、すべてのコメントの最初の 2 つの返信のみを取得したいので、$slice 演算子を使用する必要があります。

しかし、コメントの返信の合計数も取得する必要があるので、同じクエリでそれを実行できますか?

私はmongoリポジトリでSpring Bootを使用しているので、今のところ私のクエリは次のようになります

@Query(value = "{}", fields = "{ replies : { $slice : 2 }}")
public Page<FirstLevelComment> findByContentId(String contentId, Pageable page);

しかし、そのクエリに返信の数を追加する方法がわかりません。

EDIT:Alex P.が言ったようにクエリを追加しました

db.comment.aggregate([
{$match:{contentId: "5a12996de7e84e0001b93a91"}},
{
  $project: { 
    _id: 1,
    _class: 1,
    contentId: 1,
    date: 1,
    text: 1,
    countSize: {$size: "$replies"},
    sl: {$slice: ["$replies", 2]}
  }
}])
4

2 に答える 2

1

を使用して以下の集計を試すことができますMongoTemplate

ProjectionOperation project = Aggregation.project().and("replies").slice(2).as("first 2 comments").and("replies").size().as("count");
SkipOperation skip  = Aggregation.skip(2L);
LimitOperation limit = Aggregation.limit(5);
Aggregation aggregation = Aggregation.newAggregation(project, skip, limit);
AggregationResults<Document> result = mongoTemplate.aggregate(aggregation, collectionname, Document.class);
于 2018-01-29T11:23:11.587 に答える