[MONGODB] MongoDB의에서 문자열 필드 값의 길이
MONGODBMongoDB의에서 문자열 필드 값의 길이
필드의 데이터 형식은 String입니다. 나는 필드 이름의 문자 길이가 40보다 큰 경우 데이터를 가져 싶습니다.
나는 오류를 반환하지만 이러한 쿼리를 시도했다. 1.
db.usercollection.find(
{$where: "(this.name.length > 40)"}
).limit(2);
output :error: {
"$err" : "TypeError: Cannot read property 'length' of undefined near '40)' ",
"code" : 16722
}
이 2.4.9에서 작동하지만 내 버전은 2.6.5이다
해결법
-
==============================
1.MongoDB를 3.6 및 최신 경우 :
MongoDB를 3.6 및 최신 경우 :
은 $ EXPR 연산자는 쿼리 언어에서 집계 표현의 사용은, 그래서 당신은 다음과 같이 문자열의 길이를 확인하기 위해 $ strLenCP 연산자의 사용을 활용할 수 있습니다 :
db.usercollection.find({ "name": { "$exists": true }, "$expr": { "$gt": [ { "$strLenCP": "$name" }, 40 ] } })
MongoDB를 3.4 및 최신 경우 :
당신은 또한 당신이 $ 콘드 연산자와 논리 상태 였는지를 할 수 있으며에 특수 작전 $$ KEEP을 사용하는 $의 편집하다 파이프 라인 연산자로 집계 프레임 워크를 사용할 수있는 논리적 인 조건이 true 또는 $ $ PRUNE있는 문서를 "유지" "제거"조건이 거짓 문서에.
이 작업을 선택하는 컬렉션의 필드와 그 $의 편집하다를 제외하고, 다음 논리적 조건 쿼리 및 후속 $ 매치의 결과를 유지하는 새로운 필드를 만들고 더 단일 파이프 라인 단계를 사용하는 $ 프로젝트 파이프 라인을 가진 유사하다 실력 있는.
논리적 조건에 관해서는, 당신은 문자열의 길이를 확인하기 위해 $ strLenCP 연산자를 사용할 수있는 문자열 집계 연산자가 있습니다. 길이가 $ 하였다에게 지정된 값을 경우,이 진정한 일치와 문서는 "유지"입니다. 그렇지 않으면 "정리"를 삭제됩니다.
위의 개념을 보여 다음 집계 작업을 실행 해보십시오 :
db.usercollection.aggregate([ { "$match": { "name": { "$exists": true } } }, { "$redact": { "$cond": [ { "$gt": [ { "$strLenCP": "$name" }, 40] }, "$$KEEP", "$$PRUNE" ] } }, { "$limit": 2 } ])
여기서 $를 사용하는 경우, 둘러싸는 괄호없이 쿼리를 시도 :
db.usercollection.find({$where: "this.name.length > 40"}).limit(2);
더 나은 쿼리 필드의 존재를 확인하고 길이를 확인하는 것입니다 :
db.usercollection.find({name: {$type: 2}, $where: "this.name.length > 40"}).limit(2);
또는:
db.usercollection.find({name: {$exists: true}, $where: "this.name.length > 40"}).limit(2);
MongoDB를가 비 $을 평가하는 경우 쿼리 작업 $ 전에 위치를 표현하고 쿼리 문은 인덱스를 사용할 수 있습니다 비 $. 훨씬 더 나은 성능을 다른 필드와 문자열의 길이를 저장하는 것입니다 그리고 당신은 인덱스 또는 검색 할 수 있습니다; 훨씬 낮은 속도에 비해됩니다 적용 $. 자바 스크립트 표현식을 사용하는 것을 권장하고 년대 $ 위치를 다른 방식으로 데이터를 구조화 할 수없는, 또는 당신이 다루고있는 때 최후의 수단으로 운영자 데이터의 일부분.
운영자가 $ 정규식 연산자 인 $의 사용을 피하는 다른 빠른 방법. 검색 다음과 같은 패턴을 고려
db.usercollection.find({"name": {"$type": 2, "$regex": /^.{41,}$/}}).limit(2);
주 - 문서에서 :
-
==============================
2.여기에 당신이 이것을 달성 할 수 MongoDB를있는 방법 중 하나입니다.
여기에 당신이 이것을 달성 할 수 MongoDB를있는 방법 중 하나입니다.
db.usercollection.find({ $where: 'this.name.length < 4' })
-
==============================
3.나는 시나리오의 유사한 종류를했다,하지만 내 경우 문자열은 1 레벨 속성이 아닙니다. 그것은 객체 안에 있습니다. 여기에서 나는 그것에 대한 적절한 답을 찾을 수 없습니다. 나는 여러분 모두와 함께 내 솔루션 공유 할 생각 그래서 (희망을이 문제의 비슷한 종류의 사람을 도움이 될 것입니다).
나는 시나리오의 유사한 종류를했다,하지만 내 경우 문자열은 1 레벨 속성이 아닙니다. 그것은 객체 안에 있습니다. 여기에서 나는 그것에 대한 적절한 답을 찾을 수 없습니다. 나는 여러분 모두와 함께 내 솔루션 공유 할 생각 그래서 (희망을이 문제의 비슷한 종류의 사람을 도움이 될 것입니다).
Parent Collection { "Child": { "name":"Random Name", "Age:"09" } }
예 : 우리가 자녀의 이름의 길이를 가진 것은 10 자보다 높은 것으로에만 컬렉션을 얻을 필요합니다.
db.getCollection('Parent').find({$where: function() { for (var field in this.Child.name) { if (this.Child.name.length > 10) return true; } }})
-
==============================
4.너무 많은 문서가있는 경우 느린 EXPR $ 어디서 $로 조회합니다.
너무 많은 문서가있는 경우 느린 EXPR $ 어디서 $로 조회합니다.
$ 정규식을 사용하면 훨씬 더 빨리 $ 경우, $ EXPR보다.
db.usercollection.find({ "name": /^[\s\S]{40,}$/, // name.length >= 40 }) or db.usercollection.find({ "name": { "$regex": "^[\s\S]{40,}$" }, // name.length >= 40 })
이 쿼리와 동일한 의미이다
db.usercollection.find({ "$where": "this.name && this.name.length >= 40", }) or db.usercollection.find({ "name": { "$exists": true }, "$expr": { "$gte": [ { "$strLenCP": "$name" }, 40 ] } })
나는 내 컬렉션 각 쿼리를 테스트했다.
# find $where: 10529.359ms $expr: 5305.801ms $regex: 2516.124ms # count $where: 10872.006ms $expr: 2630.155ms $regex: 158.066ms
-
==============================
5.이 쿼리는 필드 값과 길이 모두를 줄 것이다 :
이 쿼리는 필드 값과 길이 모두를 줄 것이다 :
db.usercollection.aggregate([ { $project: { "name": 1, "length": { $strLenCP: "$name" } }} ])
from https://stackoverflow.com/questions/29577713/string-field-value-length-in-mongodb by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB의 문서에서 하위 문자열 대체하는 방법 (0) | 2019.12.04 |
---|---|
[MONGODB] 몽구스를 사용하여 MongoDB의 컬렉션에 대한 만료 시간 설정 (0) | 2019.12.04 |
[MONGODB] 어떻게 유성 문서 작업의 메시지 카운트 예는 무엇입니까? (0) | 2019.12.04 |
[MONGODB] 어떻게 스키마를 정의하지 않고 몽구스를 사용합니까? (0) | 2019.12.04 |
[MONGODB] 오브젝트의 배열에서 갱신 값 몽구스 (0) | 2019.12.03 |