sourcecode

어레이별 MongoDB 그룹 내부 요소

codebag 2023. 5. 3. 21:23
반응형

어레이별 MongoDB 그룹 내부 요소

저는 기사 목록을 가지고 있고, 각각의 기사에는 언급된 다양한 개인을 나열하는 배열 속성이 있습니다.

_id: {
    $oid: "52b632a9e4f2ba13c82ccd23"
},
providerName: "The Guardian",
url: "http://feeds.theguardian.com/c/34708/f/663860/s/3516cebc/sc/38/l/0L0Stheguardian0N0Cmusic0C20A130Cdec0C220Cwaterboys0Efishermans0Eblues0Etour0Ehammersmith/story01.htm",
subject: "The Waterboys – review",
class_artist: [
    "paul mccartney"
]

저는 모든 개별 아티스트의 목록을 얻기 위해 (성공적이지 못한) 노력해왔습니다.class_artist), 지난 7일 동안 태그가 지정된 기사 수를 기준으로 합니다.

여기까지 왔습니다.

var date = new Date();
date.setDate(date.getDate() - 7);

db.articles.group({
    key: { class_artist: 1 },
    cond: { class_date: { $gt: date } },
    reduce: function ( curr, result ) { result.cnt++; },
    initial: { cnt : 0 }
}).sort({cnt: -1});

그러나 안타깝게도 개별 배열 값을 기준으로 계산하지 않고 배열 구성(즉, 아티스트 목록)으로 계산합니다.

사용해 보았습니다.$unwind기능하지만 작동하지 않습니다.

어떤 프레임워크를 사용하고 있습니까?이것은 MongoDB 쉘이 아니며 MapReduce 주변의 이상한 포장지처럼 보입니다.이 경우 $unwind를 사용할 수 없으므로 집계 프레임워크의 사용자에게 $unwind가 필요합니다.몽고 껍질에서 원하는 것은 다음과 같습니다.

db.articles.aggregate([
  {$match: { class_date: { $gte: date } } },
  {$project: { _id: 0, class_artist: 1 } },
  {$unwind: "$class_artist" },
  {$group: { _id: "$class_artist", tags: { $sum: 1 } }},
  {$project: { _id: 0,class_artist: "$_id", tags: 1 } },
  {$sort: { tags: -1 } }
])

효율적으로:

  1. 지난 7일 동안 이미 변수를 설정했으므로 날짜별로 필터링
  2. 필요한 필드만 프로젝트 {하나만 필요합니다!}
  3. 모든 문서에 있는 모든 배열 요소에 대한 레코드를 가질 수 있도록 배열을 해제합니다.
  4. 확장된 문서에서 아티스트 그룹화
  5. _id로 엉망진창인 그룹으로 사용할 수 있는 문서 형식으로 프로젝트 수행
  6. 결과를 역순으로 정렬하여 먼저 태그가 지정된 상단을 확인합니다.

집합체의 좋은 점은 단계적으로 그 단계들을 구축해서 무슨 일이 일어나고 있는지 볼 수 있다는 것입니다.

필요에 따라 자신만의 드라이버 구현 또는 ODM 프레임워크를 흔들어 굽습니다.

언급URL : https://stackoverflow.com/questions/21509045/mongodb-group-by-array-inner-elements

반응형