programing

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

telecom 2023. 3. 31. 21:35
반응형

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

$project aggregation stage를 정의하여 기존 필드를 모두 나열할 필요 없이 새 필드를 추가하고 기존 필드를 모두 포함하도록 지시하고 싶습니다.

문서에는 다음과 같은 필드가 있습니다.

{
    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...
]

이 경우 include all fields 키워드를 사용하거나 각 필드를 개별적으로 나열하지 않아도 되는 다른 방법이 있습니까?

4.2+에서는 집약 파이프라인 연산자를 사용할 수 있습니다.이 연산자는 3.4에서 추가된 에일리어스에 지나지 않습니다.

$addFields단계는 입력 문서의 모든 기존 필드를 명시적으로 지정하고 새 필드를 추가하는 단계와 동일합니다.

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 등)에서 데이터를 그룹화/계산하고 모든 수집 필드를 반환하기 위한 것이 아니기 때문입니다.

사용할 수 있는 새 필드를 문서에 추가하려면$addFields

문서에서

문서의 모든 필드에 대해$$ROOT

db.collection.aggregate([

{ "$addFields": { "custom_field": "$obj.obj_field1" } },
{ "$group": {
        _id : "$field1",
        data: { $push : "$$ROOT" }
    }}
])

버전 2.6.4 현재, Mongo DB는 이러한 기능을 가지고 있지 않습니다.$project집약 파이프라인의 문서로부터$project:

지정된 필드만 있는 문서를 파이프라인의 다음 단계로 전달합니다.지정된 필드는 입력 문서의 기존 필드이거나 새로 계산된 필드일 수 있습니다.

그리고.

_id 필드는 기본적으로 출력 문서에 포함됩니다.입력 문서의 다른 필드를 출력 문서에 포함하려면 $프로젝트에 포함을 명시적으로 지정해야 합니다.

@Deka reply에 따르면 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

반응형