복붙노트

[MONGODB] MongoDB의에서 문자열 필드 값의 길이

MONGODB

MongoDB의에서 문자열 필드 값의 길이

필드의 데이터 형식은 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. ==============================

    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. ==============================

    2.여기에 당신이 이것을 달성 할 수 MongoDB를있는 방법 중 하나입니다.

    여기에 당신이 이것을 달성 할 수 MongoDB를있는 방법 중 하나입니다.

    db.usercollection.find({ $where: 'this.name.length < 4' })
    
  3. ==============================

    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. ==============================

    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. ==============================

    5.이 쿼리는 필드 값과 길이 모두를 줄 것이다 :

    이 쿼리는 필드 값과 길이 모두를 줄 것이다 :

    db.usercollection.aggregate([
    {
        $project: {
            "name": 1,
            "length": { $strLenCP: "$name" }
        }} ])
    
  6. from https://stackoverflow.com/questions/29577713/string-field-value-length-in-mongodb by cc-by-sa and MIT license