Mongodb $strcasecmp. 当字段内容有美元符号时的奇怪行为。

问题描述 投票:1回答:3

我正在MongoDB Aggregation Framework上尝试比较两个字符串。这是我正在使用的查询。

db.people.aggregate({
   $project:{
    name:1,
    balance:1,
    compareBalance:{$strcasecmp:["$balance","$2,500.00"]}
   }    
});

我的问题是每个"$balance "字段在字符串的开头都有一个美元符号 而查询返回的结果似乎不正确 比如说:"$balance "这个字段在字符串的开头有一个美元符号,而查询返回的结果似乎不正确。

{
   "_id" : ObjectId("5257e2e7834a87e7ea509665"),
   "balance" : "$1,416.00",
   "name" : "Houston Monroe",
   "compareBalance" : 1
}

正如你看到的结果,字段的比较值是1 但它应该是 -1 因为2500美元比1416美元高。事实上,所有的比较值都是1。

有一个变通的方法,使用$substr删除所有字段开头的美元符号,但我想知道谁做错了,MongoDB还是我。

先谢谢你。

mongodb string-comparison aggregation-framework
3个回答
3
投票

听起来你是想把 "余额 "字段作为一个数字来使用,例如可能想把10美元和100美元进行比较。最好的方法是存储实际值,并在显示给用户时添加格式化,$ ,等。

稍微有点无关......不知道你是否对数值做了很多计算,但是,使用二进制浮点数来表示货币是一个坏主意(不能准确地表示所有的数字),所以,通常最好是用分值存储一个整数(或者如果需要高精度,则用百分之一分值的整数)这可以给出:balanceCents.250000或balanceFourDec:25000000Then你可以使用$gt $lt和算术。250000或balanceFourDec: 25000000Then you can use $gt $lt and arithmetic.


0
投票

$ 被用作字段引用操作符。所以,聚合流水线试图在一个叫作 "$balance""$2,500.00":

{
    "balance": "$5,000.00",
    "2,500.00": undefined
}

当然,这不是你要找的。

你不应该从 $ 在数据中。另外,除非你有固定长度的字符串,否则如果你试图将数字存储为字符串,排序和比较不会以你期望的方式工作。如果你只是在做这个例子,我建议你对数字使用实际的数学运算符,而不要使用 $strcasecmp 到实际的字符串。


0
投票

你可以使用{ $literal: < value > }管道操作符来忽略现金符号。https:/docs.mongodb.commanualreferenceoperatoraggregationliteral

© www.soinside.com 2019 - 2024. All rights reserved.