2017-04-14 7 views
0

$プロジェクトの余分なフィールドに私を許可しませんが、私は単純に$プロジェクトの一部は、通常のフィールドのために動作しない理由を把握することはできません」請求書」テーブル:

{ 
    "_id" : "AS6D0", 
    "invoiceNumber" : 23, 
    "bookingId" : "AS6D0", 
    "createDate" : 1490369414, 
    "dueDate" : 1490369414, 
    "invoiceLines" : [ 
     { 
      "lineText" : "Rent Price", 
      "amountPcs" : "8 x 7500", 
      "amountTotal" : 60000 
     }, 
     { 
      "lineText" : "Discount(TIKO10)", 
      "amountPcs" : "10%", 
      "amountTotal" : -10000 
     }, 
     { 
      "lineText" : "Final cleaning", 
      "amountPcs" : "1 x 5000", 
      "amountTotal" : 5000 
     }, 
     { 
      "lineText" : "Reservation fee paid already", 
      "amountPcs" : "1 x -20000", 
      "amountTotal" : -20000 
     } 
    ], 
    "managerId" : "4M4KE" 
} 

そして、これが私のクエリ

db.getCollection('invoice').aggregate([ 
    { 
     $match: { 
      bookingId: "AS6D0" 
     } 
    }, 

    { 
     $unwind: "$invoiceLines"   
    }, 

    { 
     $group: { 
      _id: "$_id", 
      sum: {$sum: "$invoiceLines.amountTotal"} 
     } 
    }, 

    { 
     $project:{ 
      "_id" : 0, 
      "invoiceNumber" : 1, 
      "dueDate" : 1, 
      "sum" : 1 
     } 
    } 

]) 

である私は_idとの和を得るが、それは文句を言わないinvoiceNumberとdueDate

を表示
+0

もちろん、グループ化すると、そのグループに属していないフィールドにはアクセスできません。あなたは彼らに何が返されると思いますか?それはグループ化です。 –

+0

@MateoBarahonaあなたは正しいですが、この場合、レコード内に配列をグループ化しています。 dueDateとinvoiceNumberはその配列の一部ではありません。私はレコードのセットをグループ化するかどうかを理解していますが、この場合はレコードをグループ化しています。何か案は? – torbenrudgaard

+0

私が言ったように、私はあなたが集約するときに$ group句で定義されていないものを得ることは期待できないと思います。 –

答えて

1

あなたはこのようなトリック使用することができます(私は単一の値の配列を避けるために、フィールド上のアンワインドを行う)

更新 :マテオへ

db.getCollection('invoice').aggregate([ 
{ $match: { } }, 
{ $unwind: "$invoiceLines" }, 
{ $group: { _id: "$_id", 
sum: {$sum: "$invoiceLines.amountTotal"}, 
invoiceNumber: { $addToSet: "$invoiceNumber" }, 
dueDate: { $addToSet: "$dueDate" } } } 
]); 
0

おかげで、これは私がなってしまったものです:フィールドを単一の値の配列に減らすためにを使用する場合は、$addToSetを使用する必要はありません。代わりに$firstを使用してください。

db.getCollection('invoice').aggregate([ 
    { 
     $match: { 
      bookingId: "AS6D0" 
     } 
    }, 

    { 
     $unwind: "$invoiceLines"   
    }, 

    { 
     $group: { 
      _id: "$_id", 
      sum: {$sum: "$invoiceLines.amountTotal"}, 
      invoiceNumber: { $first: "$invoiceNumber" }, 
      dueDate: { $first: "$dueDate" }   
     } 
    }, 
    { 
     $project:{ 
      "_id" : 0, 
      "invoiceNumber" : 1, 
      "dueDate" : 1, 
      "sum" : 1 
     } 
    } 

]) 
+0

@Veeram - thats great !!私は最初$について知りませんでした。おかげで多くのVeeram :) – torbenrudgaard

関連する問題