0

我在 MongoDB 中有一个文档,如下所示。

{                                                              
  "CorePrice" : 1,
  "_id" : 166,
  "partno" : 76,
  "parttype" : "qpnm",
  "shipping" :
    [
      {
        "shippingMethod1" : "ground",
        "cost1" : "10"
      },
      {
        "shippingMethod2" : "air",
        "cost2" : "11"
      },
      {                                                              
        "shippingMethod3" : "USPS",
        "cost3" : "3"
      },
      {
        "shippingMethod4" : "USPS",
        "cost4" : 45
      }
    ]
}

我的目标是将 CorePrice (1) 添加到 cost4 (45) 并将计算值检索为新列“dpv”。我尝试使用以下查询。但是我收到一个错误exception: $add only supports numeric or date types, not Array。我不确定为什么。任何形式的帮助将不胜感激。

db.Parts.aggregate([
  {
    $project: {
      partno: 1,
      parttype: 1,
      dpv: {$add: ["$CorePrice","$shipping.cost1"]}
    }
  },
  {
    $match: {"_id":{$lt:5}}
  }
]);
4

2 回答 2

1

当您引用该字段shipping.cost1并且shipping是一个数组时,MongoDB 不知道shipping您指的是 -array 的哪个条目。在您的情况下,数组中只有一个带有 field 的条目cost1,但这不能保证。这就是你得到错误的原因。

当您能够更改数据库架构时,我建议您将shipping每种运输类型转换为具有字段的对象。这将使您能够更好地解决这些问题。当这是不可能的或会破坏其他用例时,您可以尝试通过数字索引 ( shipping.0.cost1) 访问数组条目。

您可以尝试的另一件事是使用$sum-operator创建所有shipping.cost1字段的总和。当数组中只有一个元素带有 fieldcost1时,结果将是它的值。

于 2013-09-30T10:59:31.927 回答
0

我可以通过将查询分成两个来实现这一点,如下所示。

var pipeline1 = [
    {
        "$unwind": "$shipping"
    }, 
    {
        $project:{
            partno:1, 
            parttype:1,
            dpv:{
                $add:["$CorePrice","$shipping.cost4"]
            }
        }
    }, 
    {
        $match:{"_id":5}
    }
];               

R = db.tb.aggregate( pipeline );
于 2013-10-06T05:29:05.083 回答