programing

MongoDB의 실제 필드 유형 반환

cafebook 2023. 7. 2. 20:57
반응형

MongoDB의 실제 필드 유형 반환

MongoDB에서, 사용$type필드가 BSON 데이터 유형과 일치하는지 여부를 기준으로 검색을 필터링할 수 있습니다(DOC 참조).

예를 들면.

db.posts.find({date2: {$type: 9}}, {date2: 1})

다음을 반환합니다.

{ 
    "_id" : ObjectId("4c0ec11e8fd2e65c0b010000"), 
    "date2" : "Fri Jul 09 2010 08:25:26 GMT" 
}

컬렉션의 모든 필드에 대해 실제 필드 유형이 무엇인지 알려주는 쿼리가 필요합니다.MongoDB로 이것이 가능합니까?

MongoDB 3.4부터는 집계 연산자를 사용하여 필드 유형을 반환할 수 있습니다.

db.posts.aggregate( 
    [ 
        { "$project": { "fieldType": {  "$type": "$date2"  } } } 
    ]
)

다음과 같은 결과:

{ 
    "_id" : ObjectId("4c0ec11e8fd2e65c0b010000"), 
    "fieldType" : "string" 
}

아래 쿼리를 mongo 셸에 입력합니다.

  typeof db.employee.findOne().first_name

구문

 typeof db.collection_name.findOne().field_name

다음은 도움이 될 수 있는 몇 가지 관련 질문입니다.

map-reduce를 사용하여 집합의 모든 필드 이름을 가져옵니다.

다음은 가능한 모든 필드를 나열하는 재귀 버전입니다.

그것이 당신을 시작하게 할 수 있기를 바랍니다.그러나 이 요청으로 인해 몇 가지 문제가 발생할 것으로 예상됩니다.여기에는 두 가지 문제가 있습니다.

  1. JSON에 대한 "gettype" 함수를 찾을 수 없습니다.다음을 기준으로 쿼리할 수 있습니다.$type하지만 실제로 운영할 수 있을 것 같지는 않습니다.gettypeBSON 유형으로 매핑되도록 합니다.
  2. 필드에는 여러 유형의 데이터가 포함될 수 있으므로 이를 처리하기 위한 계획이 필요합니다.Mongo가 일부 숫자를 int로 저장할 수 있고 다른 숫자는 사용자가 알지 못하는 사이에 부동할 수 있습니다.사실, PHP 드라이버를 사용하면 이것은 꽤 가능합니다.

따라서 문제 #1을 해결할 수 있다고 가정하면 "모든 필드 이름 가져오기"에서 약간의 변형을 사용하여 문제 #2를 해결할 수 있습니다.

아마도 다음과 같이 보일 것입니다.

"map" : function() { for (var key in this) { emit(key, [ typeof value[key] ]); } }
"reduce" : function(key, stuff) { return (key, add_to_set(stuff) ); }

그래서 기본적으로 당신은 방출할 것입니다.key그리고type of key value(어레이로) 지도 함수에 표시됩니다.그런 다음 축소 함수에서 각 유형에 대해 고유한 항목을 추가합니다.

실행이 끝나면 다음과 같은 데이터가 표시됩니다.

{"_id":[255], "name" : [1,5,8], ... }

물론 이 모든 작업은 많은 작업입니다. 실제 문제에 따라 코드를 통해 항상 올바른 유형의 데이터를 입력하고 있는지 확인해야 할 수도 있습니다.데이터가 DB에 저장된 후에 데이터 유형을 찾는 것은 분명히 어려운 일입니다.

styvane 쿼리를 활용하여 데이터 유형이 다를 때 읽기 쉽도록 $group 목록을 추가했습니다.

db.posts.aggregate( 
[ 
    { "$project": { _id:0, "fieldType": {  "$type": "$date2"  } } },
    {"$group": { _id: {"fieldType": "$fieldType"},count: {$sum: 1}}}
])

그리고 다음과 같은 결과를 얻습니다.

{ "_id" : { "fieldType" : "missing" }, "count" : 50 }
{ "_id" : { "fieldType" : "date" }, "count" : 70 }
{ "_id" : { "fieldType" : "string" }, "count" : 10 }

참고로a=5;a.constructor.toString()인쇄물function Number() { [native code] }다음과 유사한 작업을 수행할 수 있습니다.

db.collection.mapReduce(
function() {
    emit(this._id.constructor.toString()
       .replace(/^function (\S+).+$/,  "$1"), 1);
}, 
function(k, v) {
    return Array.sum(v);
}, 
{ 
    out: { inline: 1 } 
});

언급URL : https://stackoverflow.com/questions/3208538/return-actual-type-of-a-field-in-mongodb

반응형