MongoDB에서 문자열 필드의 길이가 특정 값보다 큰 문서를 조회하려면 $where 연산자를 사용하면 됩니다. $where는 자바스크립트 표현식을 기반으로 조건을 평가하기 때문에, this.필드명.length처럼 문자열의 실제 길이를 직접 비교할 수 있다는 점이 특징입니다.
기본 문법
db.yourCollectionName.find({$where: 'this.yourStringFieldName.length > yourIntegerValue'}).pretty();예제 컬렉션 생성
개념을 이해하기 위해 먼저 샘플 문서가 담긴 컬렉션을 만들어 보겠습니다.
> db.stringFieldLengthDemo.insertOne({"UserId":1,"UserName":"Adam Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77bb4b2386c62d05142a78")
}
> db.stringFieldLengthDemo.insertOne({"UserId":2,"UserName":"Carol Taylor"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77bb562386c62d05142a79")
}
> db.stringFieldLengthDemo.insertOne({"UserId":3,"UserName":"James Brown"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77bb5b2386c62d05142a7a")
}
> db.stringFieldLengthDemo.insertOne({"UserId":4,"UserName":"John Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77bb662386c62d05142a7b")
}
> db.stringFieldLengthDemo.insertOne({"UserId":5,"UserName":"David Miller"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77bb892386c62d05142a7c")
}
> db.stringFieldLengthDemo.insertOne({"UserId":6,"UserName":"John Williams"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77bbb02386c62d05142a7d")
}
> db.stringFieldLengthDemo.insertOne({"UserId":7,"UserName":"Chris Evans"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c77bbd32386c62d05142a7e")
}저장된 전체 문서 확인
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.stringFieldLengthDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c77bb4b2386c62d05142a78"),
"UserId" : 1,
"UserName" : "Adam Smith"
}
{
"_id" : ObjectId("5c77bb562386c62d05142a79"),
"UserId" : 2,
"UserName" : "Carol Taylor"
}
{
"_id" : ObjectId("5c77bb5b2386c62d05142a7a"),
"UserId" : 3,
"UserName" : "James Brown"
}
{
"_id" : ObjectId("5c77bb662386c62d05142a7b"),
"UserId" : 4,
"UserName" : "John Smith"
}
{
"_id" : ObjectId("5c77bb892386c62d05142a7c"),
"UserId" : 5,
"UserName" : "David Miller"
}
{
"_id" : ObjectId("5c77bbb02386c62d05142a7d"),
"UserId" : 6,
"UserName" : "John Williams"
}
{
"_id" : ObjectId("5c77bbd32386c62d05142a7e"),
"UserId" : 7,
"UserName" : "Chris Evans"
}문자열 길이가 11보다 큰 문서 조회하기
이제 UserName 필드의 길이가 11보다 큰 문서만 조회해 보겠습니다.
> db.stringFieldLengthDemo.find({$where:'this.UserName.length >11'}).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c77bb562386c62d05142a79"),
"UserId" : 2,
"UserName" : "Carol Taylor"
}
{
"_id" : ObjectId("5c77bb892386c62d05142a7c"),
"UserId" : 5,
"UserName" : "David Miller"
}
{
"_id" : ObjectId("5c77bbb02386c62d05142a7d"),
"UserId" : 6,
"UserName" : "John Williams"
}참고: 성능과 대안 ($expr + $strLenCP)
$where 연산자는 각 문서마다 자바스크립트를 실행하므로 인덱스를 활용할 수 없어 대량의 데이터에서는 성능이 떨어질 수 있습니다. MongoDB 3.4 이상을 사용한다면 $strLenCP 연산자와 $expr을 조합하는 방식이 더 효율적입니다.
> db.stringFieldLengthDemo.find({$expr: {$gt: [{$strLenCP: "$UserName"}, 11]}}).pretty();두 쿼리 모두 동일한 결과를 반환하지만, 일반적으로 $expr 방식이 더 권장됩니다. 상황에 맞게 선택하여 사용하시기 바랍니다.