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를 사용하여 집합의 모든 필드 이름을 가져옵니다.
다음은 가능한 모든 필드를 나열하는 재귀 버전입니다.
그것이 당신을 시작하게 할 수 있기를 바랍니다.그러나 이 요청으로 인해 몇 가지 문제가 발생할 것으로 예상됩니다.여기에는 두 가지 문제가 있습니다.
- JSON에 대한 "gettype" 함수를 찾을 수 없습니다.다음을 기준으로 쿼리할 수 있습니다.
$type
하지만 실제로 운영할 수 있을 것 같지는 않습니다.gettype
BSON 유형으로 매핑되도록 합니다. - 필드에는 여러 유형의 데이터가 포함될 수 있으므로 이를 처리하기 위한 계획이 필요합니다.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
'programing' 카테고리의 다른 글
SQL: 처음 찾은 행에서 조인을 제한하는 방법은 무엇입니까? (0) | 2023.07.02 |
---|---|
spring-boot-starter-web과 spring-boot-starter-weblux는 함께 작동하지 않습니까? (0) | 2023.07.02 |
디버깅 없이 잘못된 명령 오류를 발생시킨 어셈블리 명령 찾기 (0) | 2023.07.02 |
Python을 사용하여 디렉토리의 모든 파일 삭제 (0) | 2023.07.02 |
이미지에서 알파 채널 제거 (0) | 2023.07.02 |