가격이 문자열로 저장된 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
'programing' 카테고리의 다른 글
대소문자를 무시하고 문자열을 비교하는 방법 (0) | 2023.07.05 |
---|---|
Oracle, Postgres 및 SQL Server의 문자열 연결 연산자 (0) | 2023.06.30 |
내부 클래스에서 외부 클래스에 액세스하는 방법은 무엇입니까? (0) | 2023.06.30 |
PL/SQL 패키지, 프로시저 또는 함수가 사용되고 있는지 어떻게 알 수 있습니까? (0) | 2023.06.30 |
LaTeX를 R 그림으로 가져오기 (0) | 2023.06.30 |