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 は、参照している -array のエントリを認識しませんshipping。あなたの場合、配列には field を持つエントリが1つしかありcost1ませんが、これは保証できません。そのため、エラーが発生します。

データベース スキーマを変更できる場合はshipping、各配送タイプのフィールドを持つオブジェクトに変換することをお勧めします。これにより、これらに適切に対処できます。これが不可能な場合、または他のユース ケースを壊す可能性がある場合は、数値インデックス ( shipping.0.cost1) で配列エントリへのアクセスを試みることができます。

もう 1 つの方法は、$sum-operatorを使用してすべてのshipping.cost1フィールドの合計を作成することです。配列内に field を持つ要素が 1 つしかない場合cost1、結果はその値になります。

于 2013-09-30T10:59:31.927 に答える