我正在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还是我。
先谢谢你。
听起来你是想把 "余额 "字段作为一个数字来使用,例如可能想把10美元和100美元进行比较。最好的方法是存储实际值,并在显示给用户时添加格式化,$ ,等。
稍微有点无关......不知道你是否对数值做了很多计算,但是,使用二进制浮点数来表示货币是一个坏主意(不能准确地表示所有的数字),所以,通常最好是用分值存储一个整数(或者如果需要高精度,则用百分之一分值的整数)这可以给出:balanceCents.250000或balanceFourDec:25000000Then你可以使用$gt $lt和算术。250000或balanceFourDec: 25000000Then you can use $gt $lt and arithmetic.
该 $
被用作字段引用操作符。所以,聚合流水线试图在一个叫作 "$balance"
和 "$2,500.00"
:
{
"balance": "$5,000.00",
"2,500.00": undefined
}
当然,这不是你要找的。
你不应该从 $
在数据中。另外,除非你有固定长度的字符串,否则如果你试图将数字存储为字符串,排序和比较不会以你期望的方式工作。如果你只是在做这个例子,我建议你对数字使用实际的数学运算符,而不要使用 $strcasecmp
到实际的字符串。
你可以使用{ $literal: < value > }管道操作符来忽略现金符号。https:/docs.mongodb.commanualreferenceoperatoraggregationliteral