programing tip

모든 기존 필드를 포함하고 문서에 새 필드 추가

itbloger 2020. 8. 13. 08:00
반응형

모든 기존 필드를 포함하고 문서에 새 필드 추가


기존 필드를 모두 나열하지 않고도 새 필드를 추가하고 모든 기존 필드를 포함하도록 지시 할 수있는 $ 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);

참고 URL : https://stackoverflow.com/questions/19431773/include-all-existing-fields-and-add-new-fields-to-document

반응형