$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
'programing' 카테고리의 다른 글
스프링 부팅에서 @EnableWebFluxSecurity를 사용할 때 오류 발생 (0) | 2023.06.19 |
---|---|
Mongoose - RangeError: 최대 콜 스택 크기 초과 (0) | 2023.06.19 |
모든 컨트롤러에 대해 기본 @RestController URI 접두사를 구성하는 방법은 무엇입니까? (0) | 2023.06.19 |
Panda DataFrame에서 빈 셀이 포함된 행을 삭제합니다. (0) | 2023.06.19 |
연속 메모리 블록이란 무엇입니까? (0) | 2023.06.19 |