source

MongoDB에서 검색/프로젝션을 수행할 때 필드 이름을 변경하려면 어떻게 해야 합니까?

manysource 2023. 5. 15. 22:21

MongoDB에서 검색/프로젝션을 수행할 때 필드 이름을 변경하려면 어떻게 해야 합니까?

찾기 쿼리에서 반환된 필드의 이름을 바꿀 수 있습니까?다음과 같은 것을 사용하고 싶습니다.$rename하지만 접근 중인 문서를 변경하고 싶지 않습니다.나는 단지 그것들을 다르게 되찾고 싶다, 마치 작동하는 것처럼.SELECT COORINATES AS COORDSSQL에서.

내가 지금 하는 일

db.tweets.findOne({}, {'level1.level2.coordinates': 1, _id:0})
{'level1': {'level2': {'coordinates': [10, 20]}}}

반품하고 싶은 것은 다음과 같습니다.{'coords': [10, 20]}

따라서 기본적으로 다음 대신 사용합니다.

db.tweets.aggregate([
    { "$project": {
        "_id": 0,
        "coords": "$level1.level2.coordinates"
    }}
])

그리고 그것은 여러분이 원하는 결과를 줍니다.

MongoDB 2.6 이상 버전은 find와 마찬가지로 "커서"를 반환합니다.

자세한 내용은 및 기타 집계 프레임워크 연산자를 참조하십시오.


대부분의 경우 필드 이름을 반환된 대로 변경해야 합니다..find()커서를 처리할 때 사용합니다.예를 들어 JavaScript의 경우 를 사용하여 이 작업을 수행할 수 있습니다.

셸에서:

db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map( doc => {
  doc.coords = doc['level1']['level2'].coordinates;
  delete doc['level1'];
  return doc;
})

인라인 또는 그 이상:

db.tweets.find({},{'level1.level2.coordinates': 1, _id:0}).map( doc => 
  ({ coords: doc['level1']['level2'].coordinates })
)

이렇게 하면 서버의 추가 오버헤드를 방지할 수 있으며, 추가 처리 오버헤드가 검색된 데이터 크기의 실제 감소 효과를 초과하는 경우에 사용해야 합니다.이 경우(그리고 대부분)는 최소이므로 재구성하기 위해 커서 결과를 다시 처리하는 것이 좋습니다.

@NeilLunn이 언급한 바와 같이 Aggregation 파이프라인을 사용하면 다음과 같은 이점을 얻을 수 있습니다.

그리고 시작Mongo 4.2집계 연산자를 사용하여 문서를 하위 연산자로 대체할 수 있습니다.

// { level1: { level2: { coordinates: [10, 20] }, b: 4 }, a: 3 }
db.collection.aggregate(
  { $replaceWith: { coords: "$level1.level2.coordinates" } }
)
// { "coords" : [ 10, 20 ] }

당신이 언급한 이후로findOne또한 다음과 같이 결과 문서 수를 1로 제한할 수 있습니다.

db.collection.aggregate([
  { $replaceWith: { coords: "$level1.level2.coordinates" } },
  { $limit: 1 }
])

에 앞서Mongo 4.2그리고 시작Mongo 3.4대신$replaceRoot 사용할 수 있습니다.$replaceWith:

db.collection.aggregate(
  { $replaceRoot: { newRoot: { coords: "$level1.level2.coordinates" } } }
)

일반적으로 $project stage는 필드 이름을 사용하고 출력에 필드를 포함하도록 1 또는 0/true 또는 false를 지정하며 필드 이름을 true 또는 false 대신 필드에 대한 값을 지정하여 필드 이름을 변경할 수도 있습니다.다음은 구문입니다.

    db.test_collection.aggregate([
        {$group: {
            _id: '$field_to_group',
            totalCount: {$sum: 1}
        }},
        {$project: {
            _id: false,
            renamed_field: '$_id',    // here assigning a value instead of 0 or 1 / true or false effectively renames the field.
            totalCount: true
        }}
    ])

단계(>= 4.2)

  • $addFields: {"새로 만들기": "$Old"}
  • $unset: {"$Old": 1}

언급URL : https://stackoverflow.com/questions/23784370/how-do-i-rename-fields-when-performing-search-projection-in-mongodb