2014-11-22 101 views
3

我正在寫一個使用聚合管道的Mongo查詢。在彙總期間,我需要$unwind其中的一個字段。但是,我不希望$unwind排除具有該字段的零長度數組的條目,因爲我仍然需要它們進一步向下。

我的字段名爲items,它是一個對象數組,它們各自包含兩個值:quantityprice。這裏是我的蒙戈查詢的片段至今:

db.MyCollection.aggregate([ 
    {$match: ... }, 
    {$project: ... }, 
    // put another $project here to retain zero-length values? how to format it? 
    {$project: { 
      _id: "$$ROOT", 
      items: { 
       $ifNull: [ 
        { 
         $literal: { 
          quantity: 0, 
          price: 0 
         } 
        } 
       ] 
      } 
     } 
    }, 
    {$unwind: "$items"}, 
    {$group: ... }, 
    {$project: ... }, 
    ... 
]); 

正如你所看到的,這已經處理的情況下的文件沒有出現在items場可言,在這種情況下,增加了它,並給出這是一個值得放鬆的空值。

但是沒有處理的是文件已經items字段存在,但它是空白的。我想我可以使用$cond$size的一些組合來明確檢查另一個$project中的零的大小,然後在這種情況下替換相同的文字,但$if需要一個布爾值,所以我不太確定如何格式化。

+0

你是什麼意思'項目是blank'? '項目:[]'?或項目:「」? – BatScream 2014-11-22 22:37:16

+0

我的意思是'物品:[]' – SoaperGEM 2014-11-22 22:37:40

回答

4

修改您project階段的管道如下:

projection階段並以下兩件事情:

  • 如果項目陣列nulldoes not exist,計算 項目字段值作爲[] (空陣列)
  • 接下來檢查剛計算的items字段的size是否爲0,如果 它是0,則將其值更改爲具有默認對象的數組。

級代碼:

db.MyCollection.aggregate([ 
... 
{$project:{"_id":"$$ROOT", 
      "items":{$cond:[ 
          {$eq:[{$size:{$ifNull:["$items",[]]}},0]}, 
          [{"quantity":0,"price":0}], 
          "$items" 
          ]}}}, 
{$unwind:"$items"}, 
... 
]) 
+1

完美。謝謝! – SoaperGEM 2014-11-22 23:46:55

相關問題