2014-11-22 98 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

相关问题