Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 $where 연산자로 특정 길이보다 긴 문자열 조회하는 방법

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 방식이 더 권장됩니다. 상황에 맞게 선택하여 사용하시기 바랍니다.