我在MongoDB中有这样的结构:
{'key': [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 1, 2, 6 ], [ 2 ] ] }
我需要获取将成为子集或等于输入数组的数组。
例如,如果输入数组为[1, 2, 6]
,则应返回[[1,2,6], [2]]
。
是否有一些"好"这样做的方法?基本上我理解我需要将运算符反转到$all
。
答案 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);
}