Mongodb 使用$unwind、$group时,对小数128字段的操作($sum、$PLYPLY、$push)无效

Mongodb 使用$unwind、$group时,对小数128字段的操作($sum、$PLYPLY、$push)无效,mongodb,azure-cosmosdb-mongoapi,Mongodb,Azure Cosmosdb Mongoapi,我使用的是Azure Mongodb API 3.4,启用了聚合管道 我正在尝试将我的年-月数据分组,并在将其乘以另一个值后在该组中添加一个值。当我在mongodb上运行它时,效果很好,但是当我尝试在Cosmos中运行它时,我得到了一个错误: > 2019-11-13T11:57:10.599-0300 E QUERY [js] uncaught exception: > Error: command failed: { > "_t" : "OKMong

我使用的是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.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"},
])
我不明白为什么这会失败,以及我可以通过什么方法来达到同样的效果。 我的数据如下所示:

> > 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")
>                 }
>         ] }
这是我正在使用的聚合查询:

> 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.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中的字段,它不会失败。

我在文档中找不到任何说明我试图完成的内容不受支持但不起作用的内容。 我尝试了一种解决方法,没有将小数相加/相乘,而是尝试将数字放入数组中,以便稍后在投影或服务器上重新计算该值。但是这也失败了,出现了相同的错误。这让我相信,即使他们没有在文档中澄清,我可以发现,这些小数运算是不受支持的

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"},
])
然而,我找到了一个解决办法。我没有在数组中推十进制值,而是推整个字段,然后在投影中计算值。令人惊讶的是,这起作用了。这远不是理想的,但我找不到任何其他的解决办法,使它在宇宙中工作

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。很自然,我的原始查询工作得很好。

我在文档中找不到任何东西表明我试图完成的内容不受支持,但不起作用。 我尝试了一种解决方法,没有将小数相加/相乘,而是尝试将数字放入数组中,以便稍后在投影或服务器上重新计算该值。但是这也失败了,出现了相同的错误。这让我相信,即使他们没有在文档中澄清,我可以发现,这些小数运算是不受支持的

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"},
])
然而,我找到了一个解决办法。我没有在数组中推十进制值,而是推整个字段,然后在投影中计算值。令人惊讶的是,这起作用了。这远不是理想的,但我找不到任何其他的解决办法,使它在宇宙中工作

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。当然,在那里我最初的查询工作得很好