返回作为输入数组子集的数组元素

时间:2016-06-25 21:59:06

标签: mongodb aggregation-framework

我在MongoDB中有这样的结构:

{'key': [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 1, 2, 6 ], [ 2 ] ] }

我需要获取将成为子集或等于输入数组的数组。

例如,如果输入数组为[1, 2, 6],则应返回[[1,2,6], [2]]

是否有一些"好"这样做的方法?基本上我理解我需要将运算符反转到$all

1 个答案:

答案 0 :(得分:0)

我们实际上可以过滤我们的数组,只返回那些与输入数组相交的元素$project我们的文档与聚合框架。

从MongoDB 3.2开始,我们可以使用$filter运算符“仅”选择满足条件的数组中的元素。

这里的条件是$setIsSubset,当数组中的元素是我们输入数组的子集时,它返回true。

let inputArray = [1, 2, 6];
db.coll.aggregate(
    [
        { "$project": { 
            "key": { 
                "$filter": { 
                    "input": "$key", 
                    "as": "k", 
                    "cond": { "$setIsSubset": [ "$$k", inputArray ] }
                }
            }
        }}
    ]
)

在以前的版本中,我们需要使用$map运算符来“过滤”数组中不满足条件的元素。在“in”表达式中,我们需要使用逻辑$cond ition处理来在条件为真时“保持”元素,并通过false“替换”元素当条件表达式求值为false时。

$setDifference运算符执行$map [false]的{​​{1}}结果和$setDifference。值得一提的是,只要被过滤的数据是“唯一的”,var inputArray = [1, 2, 6]; db.coll.aggregate( [ { "$project": { "key": { "$setDifference": [ { "$map": { "input": "$key", "as": "k", "in": { "$cond": [ { "$setIsSubset": [ "$$k", inputArray ] }, "$$k", false ] } }}, [false] ] } }} ] ) 就可以了。

int ressourceId;
int tv_number = 50;
TextView[] tv = new TextView[tv_number];

for(int i = 0; i < tv_number; i++) {
    ressourceId = getResources().getIdentifier("tv" + (i + 1), "id", context.getPackageName());
    tv[i] = (TextView) myFragmentView.findViewById(ressourceId);
}