MongoDB:最小属性匹配
我有一个像这样的MongoDB集合,两个二进制字符串10110和01111MongoDB:最小属性匹配,mongodb,Mongodb,我有一个像这样的MongoDB集合,两个二进制字符串10110和01111 { element_id:a, field_1:1, field_2:0, field_3:1, field_4:1, field_5:0} #binary string: 10110 { element_id:b, field_1:0, field_2:1, field_3:1, field_4:1, field_5:1} #binary string: 01111 我想在MongoDB中查询候选二进制字符串“1
{ element_id:a, field_1:1, field_2:0, field_3:1, field_4:1, field_5:0} #binary string: 10110
{ element_id:b, field_1:0, field_2:1, field_3:1, field_4:1, field_5:1} #binary string: 01111
我想在MongoDB中查询候选二进制字符串“11111”,但我的最小匹配(AND)值是4(不是全部5)。这意味着从DB中选择该文档只需要四个匹配的位置
因此,预期的输出将是-element_id:b
我在MongoDB网站或谷歌上找不到任何东西。有人能帮忙吗?这是我的方法,虽然有点难看 我使用map/reduce:(
f
是您的输入,您必须在函数中设置数组)
结果是:
[ { "_id" : "b", "value" : 4 } ]
这是我的方法,虽然有点难看 我使用map/reduce:(
f
是您的输入,您必须在函数中设置数组)
结果是:
[ { "_id" : "b", "value" : 4 } ]
根据简伟先前的回答,这是一个很好的方法。在MangGDB 2.2中,您也可以考虑使用.< /P>
例如,如果始终匹配11111,则可以选择感兴趣字段的值,然后只匹配至少有4个字段的值:
db.element.aggregate(
// Could use an initial $match here to find candidate documents (using indexed query)
// Use $project to add calculated total
{ $project: {
_id: 0,
element_id: 1,
// Assume we are matching 11111 and field values are always 0 or 1
total: { $add: [ "$field_1", "$field_2", "$field_3", "$field_4", "$field_5" ] }
}},
// Filter to interesting results (at least 4 fields with '1')
{ $match: {
total : { $gte : 4 }
}}
)
样本输出:
{ "result" : [ { "element_id" : "b", "total" : 4 } ], "ok" : 1 }
如果需要更通用的比较,可以使用它有条件地匹配目标数组,例如:
var targetArray = [1,1,1,1,1];
db.element.aggregate(
// Could use an initial $match here to find candidate documents (using indexed query)
// Use $project to add calculated total
{ $project: {
_id: 0,
element_id: 1,
total: { $add: [
{ $cond:[{$eq:["$field_1", targetArray[0]]}, 1, 0 ]},
{ $cond:[{$eq:["$field_2", targetArray[1]]}, 1, 0 ]},
{ $cond:[{$eq:["$field_3", targetArray[2]]}, 1, 0 ]},
{ $cond:[{$eq:["$field_4", targetArray[3]]}, 1, 0 ]},
{ $cond:[{$eq:["$field_5", targetArray[4]]}, 1, 0 ]}
]}
}},
// Filter to interesting results (at least 4 fields with a match)
{ $match: {
total : { $gte : 4 }
}}
)
有关聚合选项和当前限制的一般比较,请参阅相关的StackOverflow问题:。是一个很好的方法,正如简伟先前的回答所示。在MangGDB 2.2中,您也可以考虑使用.< /P>
例如,如果始终匹配11111,则可以选择感兴趣字段的值,然后只匹配至少有4个字段的值:
db.element.aggregate(
// Could use an initial $match here to find candidate documents (using indexed query)
// Use $project to add calculated total
{ $project: {
_id: 0,
element_id: 1,
// Assume we are matching 11111 and field values are always 0 or 1
total: { $add: [ "$field_1", "$field_2", "$field_3", "$field_4", "$field_5" ] }
}},
// Filter to interesting results (at least 4 fields with '1')
{ $match: {
total : { $gte : 4 }
}}
)
样本输出:
{ "result" : [ { "element_id" : "b", "total" : 4 } ], "ok" : 1 }
如果需要更通用的比较,可以使用它有条件地匹配目标数组,例如:
var targetArray = [1,1,1,1,1];
db.element.aggregate(
// Could use an initial $match here to find candidate documents (using indexed query)
// Use $project to add calculated total
{ $project: {
_id: 0,
element_id: 1,
total: { $add: [
{ $cond:[{$eq:["$field_1", targetArray[0]]}, 1, 0 ]},
{ $cond:[{$eq:["$field_2", targetArray[1]]}, 1, 0 ]},
{ $cond:[{$eq:["$field_3", targetArray[2]]}, 1, 0 ]},
{ $cond:[{$eq:["$field_4", targetArray[3]]}, 1, 0 ]},
{ $cond:[{$eq:["$field_5", targetArray[4]]}, 1, 0 ]}
]}
}},
// Filter to interesting results (at least 4 fields with a match)
{ $match: {
total : { $gte : 4 }
}}
)
有关聚合选项和当前限制的一般比较,请参阅相关的StackOverflow问题:。您可以使用
$或修饰符以编程方式构建复杂查询,以匹配请求元素的所有可能组合:
buildQuery = function(arr){
var N, i, j, query, subquery;
N = arr.length;
query = {$or: []};
for (i = 1; i <= N; ++i) {
subquery = {};
for (j = 1; j <= N; ++j) {
if (i === j) continue;
subquery['field_' + j] = arr[j-1];
}
query.$or.push(subquery);
}
return query;
}
query = buildQuery([1,1,1,1,1]);
db.collection.find(query)
您可以使用$或修饰符以编程方式构建复杂查询,以匹配所请求元素的所有可能组合:
buildQuery = function(arr){
var N, i, j, query, subquery;
N = arr.length;
query = {$or: []};
for (i = 1; i <= N; ++i) {
subquery = {};
for (j = 1; j <= N; ++j) {
if (i === j) continue;
subquery['field_' + j] = arr[j-1];
}
query.$or.push(subquery);
}
return query;
}
query = buildQuery([1,1,1,1,1]);
db.collection.find(query)
还值得投票和观看功能请求,因为这可以让您直接使用二进制字符串。还可以投票和观看功能请求,因为这可以让您直接使用二进制字符串。