programing

$aggregation 프레임워크에서 개체 찾기

css3 2023. 6. 19. 21:57

$aggregation 프레임워크에서 개체 찾기

MongoDB 집계 프레임워크에서 저는 객체(즉, JSON 컬렉션)에 $unwind 연산자를 사용하기를 희망했습니다.이것은 불가능해 보이는데, 해결책이 있나요?이를 구현할 계획이 있습니까?

예를 들어, 집계 문서에서 기사 모음을 가져옵니다. 사용자 -> 등급의 맵인 추가 필드 "등급"이 있다고 가정합니다.각 사용자의 평균 등급을 계산해 주시겠습니까?

이 외에도, 저는 통합 프레임워크에 상당히 만족합니다.

업데이트: 요청당 JSON 컬렉션의 단순화된 버전입니다.저는 게놈 데이터를 저장하고 있습니다.저는 유전자형을 배열로 만들 수 없습니다. 왜냐하면 가장 일반적인 룩업은 무작위로 유전자형을 얻는 것이기 때문입니다.

variants: [

    {
        name: 'variant1', 
        genotypes: {

            person1: 2,
            person2: 5,
            person3: 7,

        }
    }, 

    {
        name: 'variant2', 
        genotypes: {

            person1: 3,
            person2: 3,
            person3: 2,

        }
    }

]

집계 프레임워크를 사용하여 설명하는 유형의 계산을 수행할 수 없습니다. 이는 데이터가 없기 때문이 아닙니다.$unwind비흡연자를 위한 방법.person:value 객체가 배열의 문서인 경우에도,$unwind도움이 되지 않을 것입니다.

"그룹 기준" 기능(MongoDB 또는 관계형 데이터베이스)은 필드 또는 열 값에서 수행됩니다.필드의 값과 다른 필드의 값을 기준으로 합/평균/등으로 그룹화합니다.

간단한 예는 제안한 내용의 변형으로, 예 문서 모음에 등급 필드가 추가되지만 사용자에서 등급까지 맵이 아니라 다음과 같은 배열로 추가됩니다.

{ title : title of article", ...
  ratings: [
         { voter: "user1", score: 5 },
         { voter: "user2", score: 8 },
         { voter: "user3", score: 7 }
  ]
}

이제 다음을 사용하여 이를 집계할 수 있습니다.

[ {$unwind: "$ratings"},
  {$group : {_id : "$ratings.voter", averageScore: {$avg:"$ratings.score"} } } 
]

그러나 설명한 대로 구성된 이 예는 다음과 같습니다.

{ title : title of article", ...
  ratings: {
         user1: 5,
         user2: 8,
         user3: 7
  }
}

아니면 심지어 이것도:

{ title : title of article", ...
  ratings: [
         { user1: 5 },
         { user2: 8 },
         { user3: 7 }
  ]
}

네가 할 수 있다고 해도,$unwind이것, 여기에 집계할 것이 없습니다.가능한 모든 키(사용자)의 전체 목록을 알고 있지 않으면 이 작업을 많이 수행할 수 없습니다.[*]

사용자가 가지고 있는 것과 유사한 관계형 DB 스키마는 다음과 같습니다.

CREATE TABLE T (
   user1: integer,
   user2: integer,
   user3: integer
   ...
);

그렇게 하면 안 됩니다. 대신 다음과 같은 작업을 수행할 것입니다.

CREATE TABLE T (
   username: varchar(32),
   score: integer
);

이제 SQL을 사용하여 집계합니다.

select username, avg(score) from T group by username;

MongoDB에 대한 개선 요청이 있습니다. 이를 통해 향후 집계 프레임워크에서 이 작업을 수행할 수 있습니다. 즉, 키에 값을 투영할 수 있습니다.한편, 항상 지도/축소가 있습니다.

[*] 고유한 키를 모두 알고 있다면(이와 유사한 방법으로 고유한 키를 모두 찾을 수 있음) 복잡한 방법이 있지만, 모든 키를 알고 있다면 양식의 일련의 쿼리를 실행하는 것이 좋습니다.db.articles.find({"ratings.user1":{$exists:true}},{_id:0,"ratings.user1":1})각 사용자 X에 대해 모든 등급을 반환하고 집계 프레임워크에 필요한 매우 복잡한 투영을 수행하는 대신 충분히 단순하게 합산하고 평균화할 수 있습니다.

3.4.4부터는 $objectToArray를 사용하여 개체를 어레이로 변환할 수 있습니다.

참조: https://docs.mongodb.com/manual/reference/operator/aggregation/objectToArray/

이것은 오래된 질문이지만, 저는 시행착오를 통해 사람들이 유용하다고 생각할 수 있는 약간의 정보를 우연히 발견했습니다.

이러한 방법으로 파서를 속이면 더미 값을 풀 수 있습니다.

db.Opportunity.aggregate(
  { $project: {
        Field1: 1, Field2: 1, Field3: 1,
        DummyUnwindField: { $ifNull: [null, [1.0]] }
    }
  },
  { $unwind: "$DummyUnwindField" }
);

이렇게 하면 값의 존재 여부에 관계없이 문서당 하나의 행이 생성됩니다.이를 수정하여 원하는 결과를 생성할 수 있습니다.저는 이것을 여러 개의 $unwind to(맵/축소에서 방출(같은)과 결합하고 싶었지만, 안타깝게도 마지막 $unwind가 이기거나 결합이 아닌 교차점으로 결합하여 제가 원하는 결과를 달성하는 것이 불가능합니다.Aggregate Framework 기능은 제가 사용하고자 했던 단일 사용 사례에 맞지 않기 때문에 유감입니다(이상하게도 이 영역의 StackOverflow에 대한 많은 질문이 있는 것 같습니다). 일치율에 따라 결과를 정렬합니다.열악한 지도를 개선하면 성능이 저하되므로 이 전체 기능이 불필요하게 됩니다.

이것이 제가 발견하고 확장한 것입니다.

mongo에 실험 데이터베이스를 만들자.

db.copyDatabase('livedb' , 'experimentdb')

이제 experiment db & convert Array를 실험 컬렉션의 객체로 사용합니다.

db.getCollection('experimentcollection').find({}).forEach(function(e){
    if(e.store){
        e.ratings = [e.ratings]; //Objects name to be converted to array eg:ratings
        db.experimentcollection.save(e);
    }
})

json을 플랫 객체로 변환하는 일부 nerdy js 코드

var flatArray = [];

var data = db.experimentcollection.find().toArray();

for (var index = 0; index < data.length; index++) {

  var flatObject = {};

  for (var prop in data[index]) {

    var value = data[index][prop];

    if (Array.isArray(value) && prop === 'ratings') {
      for (var i = 0; i < value.length; i++) {
        for (var inProp in value[i]) {
          flatObject[inProp] = value[i][inProp];
        }
      }
    }else{
        flatObject[prop] = value;
    }
  }
  flatArray.push(flatObject);
}

printjson(flatArray);

언급URL : https://stackoverflow.com/questions/11189243/unwind-an-object-in-aggregation-framework