모든 기존 필드를 포함하고 문서에 새 필드 추가
기존 필드를 모두 나열하지 않고도 새 필드를 추가하고 모든 기존 필드를 포함하도록 지시 할 수있는 $ project 집계 단계를 정의하고 싶습니다.
내 문서는 다음과 같이 많은 필드가 있습니다.
{
obj: {
obj_field1: "hi",
obj_field2: "hi2"
},
field1: "a",
field2: "b",
...
field26: "z"
}
다음과 같은 집계 작업을 만들고 싶습니다.
[
{
$project: {
custom_field: "$obj.obj_field1",
//the next part is that I don't want to do
field1: 1,
field2: 1,
...
field26: 1
}
},
... //group, match, and whatever...
]
이 경우에 사용할 수있는 "모든 필드 포함"키워드와 같은 것이 있습니까? 아니면 모든 필드를 개별적으로 나열하지 않아도되는 다른 방법이 있습니까?
4.2+에서는 3.4 $set
에서 $addFields
추가 할 별칭 외에는 아무것도없는 집계 파이프 라인 연산자를 사용할 수 있습니다.
$addFields
스테이지는 동등$project
명시 입력 문서의 모든 기존의 필드를 지정하고, 새로운 필드를 추가하는 단계.
db.collection.aggregate([
{ "$addFields": { "custom_field": "$obj.obj_field1" } }
])
$$ ROOT 를 사용하여 루트 문서를 참조 할 수 있습니다 . 이 문서의 모든 필드를 필드에 유지하고 그 후에 가져 오십시오 (클라이언트 시스템에 따라 다름 : Java, C ++, ...).
[
{
$project: {
custom_field: "$obj.obj_field1",
document: "$$ROOT"
}
},
... //group, match, and whatever...
]
>>>이 경우 또는 다른 솔루션에서 사용할 수있는 "모든 필드 포함"키워드와 같은 것이 있습니까?
불행히도 집계 작업에 "모든 필드를 포함"하는 연산자가 없습니다. 유일한 이유는 집계가 대부분 컬렉션 필드 (sum, avg 등)에서 데이터를 그룹화 / 계산하고 모든 컬렉션 필드를 반환하기 위해 생성되기 때문에 직접적인 목적이 아닙니다.
버전 2.6.4부터 Mongo DB에는 $project
집계 파이프 라인에 대한 이러한 기능이 없습니다 . 로부터 문서 에 대한 $project
:
지정된 필드 만있는 문서를 파이프 라인의 다음 단계로 전달합니다. 지정된 필드는 입력 문서의 기존 필드 또는 새로 계산 된 필드 일 수 있습니다.
과
_id 필드는 기본적으로 출력 문서에 포함됩니다. 입력 문서의 다른 필드를 출력 문서에 포함하려면 $ project에 포함을 명시 적으로 지정해야합니다.
문서에 새 필드를 추가하려면 $ addFields를 사용할 수 있습니다.
[문서에서] [1]
문서의 모든 필드에 $$ ROOT를 사용할 수 있습니다.
db.collection.aggregate([
{ "$addFields": { "custom_field": "$obj.obj_field1" } },
{ "$group": {
_id : "$field1",
data: { $push : "$$ROOT" }
}}
])
[1]: https://docs.mongodb.com/master/reference/operator/aggregation/addFields/
@Deka 회신에 따르면 c # mongodb 드라이버 2.5의 경우 아래와 같은 모든 키로 그룹화 된 문서를 얻을 수 있습니다.
var group = new BsonDocument
{
{ "_id", "$groupField" },
{ "_document", new BsonDocument { { "$first", "$$ROOT" } } }
};
ProjectionDefinition<BsonDocument> projection = new BsonDocument{{ "document", "$_document"}};
var result = await col.Aggregate().Group(group).Project(projection).ToListAsync();
// For demo first record
var fistItemAsT = BsonSerializer.Deserialize<T>(result.ToArray()[0]["document"].AsBsonDocument);
'programing tip' 카테고리의 다른 글
WebRTC-확장 가능한 라이브 스트림 방송 / 멀티 캐스팅 (0) | 2020.08.14 |
---|---|
MVC Razor 동적 모델, '개체'에 'PropertyName'에 대한 정의가 포함되어 있지 않습니다. (0) | 2020.08.13 |
델리게이트는 어디에서 사용합니까? (0) | 2020.08.13 |
64 비트 OS에서 32 비트 JVM의 최대 Java 힙 크기 (0) | 2020.08.13 |
프록시와 데코레이터 패턴의 차이점 (0) | 2020.08.13 |