以下是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'穿越不同的颜色。
谢谢!
答案 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();
这使得它成为一个有效的两步过程,过滤掉可能的匹配文档,然后一次性完成累积。