programing

그룹 수를 사용하여 $group 결과를 얻는 중

powerit 2023. 7. 2. 21:03
반응형

그룹 수를 사용하여 $group 결과를 얻는 중

다음과 같은 구조를 가진 "posts"라는 컬렉션이 있다고 가정합니다(실제로는 더 복잡한 컬렉션이며, 게시물은 너무 단순합니다).

> db.posts.find()

{ "_id" : ObjectId("50ad8d451d41c8fc58000003"), "title" : "Lorem ipsum", "author" : 
"John Doe", "content" : "This is the content", "tags" : [ "SOME", "RANDOM", "TAGS" ] }

저는 이 컬렉션이 태그별로 게시물을 조회하고 결과를 태그별로 그룹화하여 페이지화된 결과를 표시해야 하는 수십만 또는 수백만에 이를 것으로 예상합니다.여기서 통합 프레임워크가 필요합니다.aggregate() 메서드를 사용하여 컬렉션을 쿼리할 계획입니다.

db.posts.aggregate([
  { "$unwind" : "$tags" },
  { "$group" : {
      _id: { tag: "$tags" },
      count: { $sum: 1 }
  } }
]);

페이지 관리자를 만들려면 출력 배열의 길이를 알아야 합니다.그러기 위해서는 다음과 같은 일을 할 수 있습니다.

db.posts.aggregate([
  { "$unwind" : "$tags" },
  { "$group" : {
      _id: { tag: "$tags" },
      count: { $sum: 1 }
  } }
  { "$group" : {
      _id: null,
      total: { $sum: 1 }
  } }
]);

그러나 그렇게 되면 이전 파이프라인(첫 번째 그룹)의 출력이 폐기됩니다.각 파이프라인의 출력을 유지하면서 두 작업을 결합할 수 있는 방법이 있습니까?전체 집계 작업의 출력이 일부 언어로 배열에 캐스트되어 내용이 계산될 수 있지만 파이프라인 출력이 16Mb 제한을 초과할 가능성이 있습니다.또한 카운트를 얻기 위해 동일한 쿼리를 수행하는 것은 낭비처럼 보입니다.

그래서 서류 결과와 카운트를 동시에 받는 것이 가능한가요?어떤 도움이든 감사합니다.

  1. 사용하다$project보호하기 위해tag그리고.count안으로tmp
  2. 사용하다$push또는addToSet저장할tmp당신의 것data목록.

코드:

db.test.aggregate(
    {$unwind: '$tags'}, 
    {$group:{_id: '$tags', count:{$sum:1}}},
    {$project:{tmp:{tag:'$_id', count:'$count'}}}, 
    {$group:{_id:null, total:{$sum:1}, data:{$addToSet:'$tmp'}}}
)

출력:

{
    "result" : [
            {
                    "_id" : null,
                    "total" : 5,
                    "data" : [
                            {
                                    "tag" : "SOME",
                                    "count" : 1
                            },
                            {
                                    "tag" : "RANDOM",
                                    "count" : 2
                            },
                            {
                                    "tag" : "TAGS1",
                                    "count" : 1
                            },
                            {
                                    "tag" : "TAGS",
                                    "count" : 1
                            },
                            {
                                    "tag" : "SOME1",
                                    "count" : 1
                            }
                      ]
              }
      ],
      "ok" : 1
}

모든 태그를 세는 것 외에는 집계 프레임워크가 필요한지 모르겠습니다. 예:

db.posts.aggregate(
  { "unwind" : "$tags" },
  { "group" : {
      _id: { tag: "$tags" },
      count: { $sum: 1 }
  } }
);

태그별로 페이지를 표시하려면 다음과 같이 일반 쿼리 구문을 사용하면 됩니다.

db.posts.find({tags: "RANDOM"}).skip(10).limit(10)

언급URL : https://stackoverflow.com/questions/13529323/obtaining-group-result-with-group-count

반응형