如何为$ sum指定多个条件 - MongoDB

时间:2017-05-18 11:44:27

标签: mongodb

以下是TShirts的示例数据,其中包含特定颜色的所有可用尺寸。

{
    _id: '591c0e588834491a10a584ef',
    prdctName: 'TShirt',
    ColorRed: [38, 40, 42, 44, 46, 48], 
    ColorPink: [38, 40, 42, 44, 46, 48],    
    ColorOrange: [38, 40, 42, 44, 46, 48]   
} 

我想计算一下指定尺寸的TShirts数量。 例如,我想找到可用于尺寸的TShirts的总数' 38'穿越不同的颜色。

谢谢!

2 个答案:

答案 0 :(得分:0)

基本上,您需要按产品过滤,然后展开所有尺寸并查找所选尺寸的计数。我想到的第一个问题是:

db.getCollection('products').aggregate([
    { $match: {prdctName:"TShirt"}},
    { $project: { prdctName:"$prdctName", allColors: { $concatArrays: [ "$ColorRed", "$ColorPink", "$ColorOrange" ] }} },
    { $unwind: "$allColors"},
    { $match: { allColors: 38 }},
    { $group: { _id: "$prdctName", count:{$sum:1}}},
])

P.S。它可能不是最佳的,但是可以从中开始。

答案 1 :(得分:0)

我能看到效率最高的是使用$concatArrays$filter缩减为匹配的元素,然后简单$sum剩余数组的$size

List<string> result = new List<string();
//use Split() to get string arrays
var a = text1.Split(":");
var b = text2.Split(":");

foreach(var s in a)
{
   if(!a.Contains("%"))
      result.Add("%start : " + a + ": %End");
}
foreach(var s in b)
{
   if(!b.Contains("%"))
      result.Add("%start : " + b + ": %End");
}

return result.Distinct();

这使得它成为一个有效的两步过程,过滤掉可能的匹配文档,然后一次性完成累积。