복붙노트

[MONGODB] MongoDB를 $된다 / $ 문자열로 저장 관련 연산자 LT

MONGODB

MongoDB를 $된다 / $ 문자열로 저장 관련 연산자 LT

나는 / 적은 사용자가 지정한 수보다보다 큰 가격으로 내 데이터베이스를 조회하기 위해 노력하고있어. 내 데이터베이스에서 가격과 같이 저장됩니다 :

{price: "300.00"}

워드 프로세서에 따르면,이 작업을해야합니다 :

db.products.find({price: {$gt:30.00}}).pretty()

하지만 어떤 결과를 반환받을. 나는 또한 시도했다 {가격 : {$에있다 : 30}}.

내가 무슨 말이냐?

그것은 그것을 가격이 문자열이 아닌 DB에서 숫자로 저장되기 때문에? 이 주위에 방법이 있나요?

해결법

  1. ==============================

    1.당신이 문자열 $ 하였다를 사용하려는 경우, 당신은 성능면에서 크지 않다 정규식을 사용하는 것입니다. 단지 가격의 숫자 값을 유지하는 새 필드를 만들거나 INT / 더블이 필드 유형을 변경하는 것이 더 쉽습니다. 자바 스크립트 버전은 작업과 같이한다 :

    당신이 문자열 $ 하였다를 사용하려는 경우, 당신은 성능면에서 크지 않다 정규식을 사용하는 것입니다. 단지 가격의 숫자 값을 유지하는 새 필드를 만들거나 INT / 더블이 필드 유형을 변경하는 것이 더 쉽습니다. 자바 스크립트 버전은 작업과 같이한다 :

    db.products.find("this.price > 30.00")
    

    JS는 사용하기 전에 숫자로 변환됩니다있다. 그러나 인덱스는이 쿼리에서 작동하지 않습니다.

  2. ==============================

    2.$된다 모든 유형에서 작동 할 수있는 연산자이다 :

    $된다 모든 유형에서 작동 할 수있는 연산자이다 :

    db.so.drop();
    db.so.insert( { name: "Derick" } );
    db.so.insert( { name: "Jayz" } );
    db.so.find( { name: { $gt: "Fred" } } );
    

    보고:

    { "_id" : ObjectId("51ffbe6c16473d7b84172d58"), "name" : "Jayz" }
    

    당신이 $있다 또는 $ LT와 숫자에 비교할 경우, 문서의 값은 숫자 여야합니다. MongoDB의의 유형은 엄격하고 같은 자동 변환하지 f.e. PHP에서 할 것입니다. 문제를 해결하기 위해, 반드시 숫자 (수레 또는 INT)로 같은 가격을 저장합니다

    db.so.drop();
    db.so.insert( { price: 50.40 } );
    db.so.insert( { price: 29.99 } );
    db.so.find( { price: { $gt: 30 } } );
    

    보고:

    { "_id" : ObjectId("51ffbf2016473d7b84172d5b"), "price" : 50.4 }
    
  3. ==============================

    3.당신이 MongoDB에의 새로운 버전이있는 경우 당신은이 작업을 수행 할 수 있습니다

    당신이 MongoDB에의 새로운 버전이있는 경우 당신은이 작업을 수행 할 수 있습니다

    $expr: {
              $gt: [
                 { $convert: { input: '$price', to: 'decimal' } },
                 { $convert: { input: '0.0', to: 'decimal' } }
                   ]
                  }
    

    $ EXPR 운영자 : https://docs.mongodb.com/manual/reference/operator/query/expr/

    $ 변환 opetator : https://docs.mongodb.com/manual/reference/operator/aggregation/convert/index.html

  4. ==============================

    4.몽고 4.0부터, 다양한 유형의 변환은 (문자열에서이 경우에) 두 번 할 수있는 새로운 $의 toDouble 집계 연산자가있다 :

    몽고 4.0부터, 다양한 유형의 변환은 (문자열에서이 경우에) 두 번 할 수있는 새로운 $의 toDouble 집계 연산자가있다 :

    // { price: "300.00" }
    // { price: "4.2" }
     db.collection.find({ $expr: { $gt: [{ $toDouble: "$price" }, 30] } })
    // { price: "300.00" }
    
  5. ==============================

    5.또는 당신에 따라, int로 값을 변환 할 수 있습니다 : http://www.quora.com/How-can-I-change-a-field-type-from-String-to-Integer-in-mongodb

    또는 당신에 따라, int로 값을 변환 할 수 있습니다 : http://www.quora.com/How-can-I-change-a-field-type-from-String-to-Integer-in-mongodb

    var convert = function(document){
    var intValue = parseInt(document.field, 10);
      db.collection.update(
        {_id:document._id}, 
        {$set: {field: intValue}}
      );
    }
    
    db.collection.find({field: {$type:2}},{field:1}).forEach(convert)
    
  6. from https://stackoverflow.com/questions/18039358/mongodb-gt-lt-operators-with-prices-stored-as-strings by cc-by-sa and MIT license