programing

가격이 문자열로 저장된 MongoDB $gt/$lt 연산자

magicmemo 2023. 6. 30. 22:16
반응형

가격이 문자열로 저장된 MongoDB $gt/$lt 연산자

데이터베이스에서 사용자가 지정한 숫자보다 크거나 작은 가격을 쿼리하려고 합니다.데이터베이스에서 가격은 다음과 같이 저장됩니다.

{price: "300.00"}

문서에 따르면, 이것은 다음과 같이 작동합니다.

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

하지만 결과는 돌아오지 않습니다.저도 해봤어요.{price: {$gt:30}}.

내가 여기서 뭘 놓쳤지요?

DB에 숫자가 아닌 문자열로 가격이 저장되어 있기 때문입니까?이 일을 피할 방법이 있습니까?

문자열과 함께 $gt를 사용하려면 regex를 사용해야 하는데, 이는 성능 측면에서 좋지 않습니다.가격의 숫자 값을 포함하는 새 필드를 만들거나 이 필드 유형을 int/double로 변경하는 것이 더 쉽습니다.Javascript 버전도 다음과 같이 작동해야 합니다.

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

js가 사용하기 전에 숫자로 변환할 것이기 때문입니다.그러나 인덱스는 이 쿼리에서 작동하지 않습니다.

$gt는 모든 유형에서 작업할 수 있는 연산자입니다.

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

반환:

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

다음 값과 비교하려는 경우$gt또는$lt문서의 값도 숫자여야 합니다.MongoDB의 유형은 엄격하며 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 }

시작하는Mongo 4.0다양한 유형에서 이중(이 경우 문자열에서)으로 변환하는 새로운 집계 연산자가 있습니다.

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

최신 버전의 mongodb가 있는 경우 다음을 수행할 수 있습니다.

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

$expr 연산자: https://docs.mongodb.com/manual/reference/operator/query/expr/

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

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

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)

언급URL : https://stackoverflow.com/questions/18039358/mongodb-gt-lt-operators-with-prices-stored-as-strings

반응형