sourcecode

$project가 있는 Mongo Aggregate 이름 바꾸기 필드?

codebag 2023. 7. 17. 20:59
반응형

$project가 있는 Mongo Aggregate 이름 바꾸기 필드?

집계 결과를 생성하지만 일부 필드의 이름을 바꾸려고 합니다.

db.articles.aggregate([
    {$match: {
        "model.lang": "en"
    }},
    {$project: {
        "_id": 0,
        "model.title": 1,
        "model.address_en": "$address",
        "model.date": { $dateToString: { format: "%Y-%m-%d", date: "$date" } }
    }}
]);

보시다시피 "model.title"을 "title"로, "model.address_en"을 "address"로, "model.date"를 "date"로 각각 이름을 바꾸려고 노력하고 있습니다.

{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }
{ "model" : { "date" : null } }

내가 뭘 잘못하고 있는 거지?

의 문서를 고려할 때articles

{ 
    "_id" : ObjectId("56cea763d43e3500f6768482"),
    "name" : "aaa",
    "model" : { 
        "lang" : "en",
        "title" : "b",
        "date" : ISODate("2016-02-25T07:04:03.414Z")
    },
}

"model.title"을 "title"로, "model.address_en"을 "address"로, "model.date"를 "date"로 바꿉니다.

db.articles.aggregate([
    {$match: {'model.lang': 'en'}}, 
    {$project: {
        _id: 0, 
        'title': '$model.title', 
        'date': {$dateToString: {format: '%Y-%m-%d', date: '$model.date'}}
    }}
])

결과는

{ "date" : "2016-02-25", "title" : "b" }
{ "date" : "2016-02-25", "title" : "c" }

그냥 이것을 사용하시면 됩니다.

db.articles.aggregate([
    {
        $match: {
            "model.lang": "en"
        }
    },
    {
        $project: {
            "_id": 0,
            "title": "$model.title",
            "address": "$model.address_en",
            "date": {
                $dateToString: { 
                    format: "%Y-%m-%d", date: "$model.date" 
                }
            }
        }
    }
]);

정답.

안드라니카슬 대답

설명하라.

당신의 코드는 당신이 말한 것과 반대로 작동합니다.당신의 코드 안에서 그것을 설명하겠습니다.

db.articles.aggregate([
    {$match: {
        "model.lang": "en"
    }},
    {$project: {
        "_id": 0,
        "model.title": 1, // Wanted: title <- model.title // Result: model.title <- model.title // it should show you title inside model object
        "model.address_en": "$address", // Wanted: address <- model.address_en // Result: model.address_en <- address // address doesn't exist! thats why it shows nothing
        "model.date": { $dateToString: { format: "%Y-%m-%d", date: "$date" } } // Wanted: date <- model.date // Result: model.date <- date // date doesn't exist! thats why it shows nothing
    }}
]);

포함할 필드가 없는 경우 $project는 해당 필드를 무시하므로 출력에 원하는 값이 표시되지 않습니다.

언급URL : https://stackoverflow.com/questions/35620274/mongo-aggregate-rename-field-with-project

반응형