使用 $unwind、$group 时,对 Decimal128 字段的操作($sum、$multiply、$push)不起作用
Operations ($sum, $multiply, $push) on Decimal128 fields not working when using $unwind, $group
我正在使用 Azure Mongodb API 3.4,启用了聚合管道。
我正在尝试按年-月对我的数据进行分组,并在将其乘以另一个值后在该组中添加一个值。当我在 mongodb 上 运行 它工作正常,但是当我尝试在 Cosmos 中这样做时,我得到这个 错误:
> 2019-11-13T11:57:10.599-0300 E QUERY [js] uncaught exception:
> Error: command failed: {
> "_t" : "OKMongoResponse",
> "ok" : 0,
> "code" : 115,
> "errmsg" : "'Modification of Decimal128 not supported' is not supported",
> "$err" : "'Modification of Decimal128 not supported' is not supported"
我不明白为什么会失败,以及我可以使用哪些变通方法来达到相同的结果。
我的数据 如下所示:
> > db.myCollection.find().pretty() {
> "_id" : ObjectId("5dc9b30727880d660c12be2e"),
> "Created" : ISODate("2019-11-11T19:14:15.584Z"),
> "MyCollection" : [
> {
> "DateField1" : ISODate("2019-11-11T00:00:00Z"),
> "DecimalValue1" : NumberDecimal("101")
> },
> {
> "DateField1" : ISODate("2019-11-12T00:00:00Z"),
> "DecimalValue1" : NumberDecimal("102")
> },
> {
> "DateField1" : ISODate("2019-11-13T00:00:00Z"),
> "DecimalValue1" : NumberDecimal("103")
> }
> ] }
这是我正在使用的聚合查询:
db.myCollection.aggregate([
{ $unwind: "$MyCollection" },
{$group: {
_id: {month : {$month : "$MyCollection.DateField1"},
year : {$year : "$MyCollection.DateField1"}},
calculation: { $sum: { $multiply: [ 0.05, "$MyCollection.DecimalValue1" ] } }
}},
{ $project: { month: "$id.month", year : "$id.year", calculation: "$calculation"},
])
我阅读了文档,显然,至少据我所知,Cosmos 支持我尝试使用的所有命令。但是,如果您从等式中删除 "$MyCollection.DecimalValue1"
,它就会起作用。基本上,如果我使用 0.05
而不是 sum/multiply 中的字段,它不会失败。
我在文档中找不到任何说明我正在尝试完成的内容不受支持但不起作用的内容。
我尝试了一种解决方法,而不是 adding/multiplying 我的 DecimalValue1 我尝试将数字推入一个数组,这样我以后可以在投影或服务器上重新计算该值。然而这也失败了,同样的错误。这让我相信,即使他们没有在我能找到的文档中澄清,但不支持这些小数运算。
db.myCollection.aggregate([
{ $unwind: "$MyCollection" },
{$group: {
_id: {month : {$month : "$MyCollection.DateField1"},
year : {$year : "$MyCollection.DateField1"}},
test: { $push: "$MyCollection.DecimalValue1" }
}},
{ $project: { month: "$id.month", year : "$id.year", test: "$test"},
])
不过,我找到了解决方法。我没有推送数组中的十进制值,而是推送整个字段,然后在投影中计算值。令人惊讶的是,这奏效了。这远非理想,但我找不到任何其他解决方法来让它在 Cosmos 中工作。
db.myCollection.aggregate([
{ $unwind: "$MyCollection" },
{$group: {
_id: {month : {$month : "$MyCollection.DateField1"},
year : {$year : "$MyCollection.DateField1"}},
accumulatedItems: { $push: "$MyCollection" }
}},
{ $project: { month: "$id.month", year : "$id.year",
calculation : { $multiply: [ 0.05, { $test: "$accumulatedItems.DecimalValue1" } ] }},
])
由于这个问题,以及其他几个在 mongodb 中运行良好的查询在 Cosmos 上无缘无故地无法运行,我们决定切换到 Atlas。自然地,我的原始查询在那里完美运行。
我正在使用 Azure Mongodb API 3.4,启用了聚合管道。
我正在尝试按年-月对我的数据进行分组,并在将其乘以另一个值后在该组中添加一个值。当我在 mongodb 上 运行 它工作正常,但是当我尝试在 Cosmos 中这样做时,我得到这个 错误:
> 2019-11-13T11:57:10.599-0300 E QUERY [js] uncaught exception:
> Error: command failed: {
> "_t" : "OKMongoResponse",
> "ok" : 0,
> "code" : 115,
> "errmsg" : "'Modification of Decimal128 not supported' is not supported",
> "$err" : "'Modification of Decimal128 not supported' is not supported"
我不明白为什么会失败,以及我可以使用哪些变通方法来达到相同的结果。 我的数据 如下所示:
> > db.myCollection.find().pretty() {
> "_id" : ObjectId("5dc9b30727880d660c12be2e"),
> "Created" : ISODate("2019-11-11T19:14:15.584Z"),
> "MyCollection" : [
> {
> "DateField1" : ISODate("2019-11-11T00:00:00Z"),
> "DecimalValue1" : NumberDecimal("101")
> },
> {
> "DateField1" : ISODate("2019-11-12T00:00:00Z"),
> "DecimalValue1" : NumberDecimal("102")
> },
> {
> "DateField1" : ISODate("2019-11-13T00:00:00Z"),
> "DecimalValue1" : NumberDecimal("103")
> }
> ] }
这是我正在使用的聚合查询:
db.myCollection.aggregate([
{ $unwind: "$MyCollection" },
{$group: {
_id: {month : {$month : "$MyCollection.DateField1"},
year : {$year : "$MyCollection.DateField1"}},
calculation: { $sum: { $multiply: [ 0.05, "$MyCollection.DecimalValue1" ] } }
}},
{ $project: { month: "$id.month", year : "$id.year", calculation: "$calculation"},
])
我阅读了文档,显然,至少据我所知,Cosmos 支持我尝试使用的所有命令。但是,如果您从等式中删除 "$MyCollection.DecimalValue1"
,它就会起作用。基本上,如果我使用 0.05
而不是 sum/multiply 中的字段,它不会失败。
我在文档中找不到任何说明我正在尝试完成的内容不受支持但不起作用的内容。 我尝试了一种解决方法,而不是 adding/multiplying 我的 DecimalValue1 我尝试将数字推入一个数组,这样我以后可以在投影或服务器上重新计算该值。然而这也失败了,同样的错误。这让我相信,即使他们没有在我能找到的文档中澄清,但不支持这些小数运算。
db.myCollection.aggregate([
{ $unwind: "$MyCollection" },
{$group: {
_id: {month : {$month : "$MyCollection.DateField1"},
year : {$year : "$MyCollection.DateField1"}},
test: { $push: "$MyCollection.DecimalValue1" }
}},
{ $project: { month: "$id.month", year : "$id.year", test: "$test"},
])
不过,我找到了解决方法。我没有推送数组中的十进制值,而是推送整个字段,然后在投影中计算值。令人惊讶的是,这奏效了。这远非理想,但我找不到任何其他解决方法来让它在 Cosmos 中工作。
db.myCollection.aggregate([
{ $unwind: "$MyCollection" },
{$group: {
_id: {month : {$month : "$MyCollection.DateField1"},
year : {$year : "$MyCollection.DateField1"}},
accumulatedItems: { $push: "$MyCollection" }
}},
{ $project: { month: "$id.month", year : "$id.year",
calculation : { $multiply: [ 0.05, { $test: "$accumulatedItems.DecimalValue1" } ] }},
])
由于这个问题,以及其他几个在 mongodb 中运行良好的查询在 Cosmos 上无缘无故地无法运行,我们决定切换到 Atlas。自然地,我的原始查询在那里完美运行。