考虑到我有以下文件(不包括_id
):
[
{
"array": [
1,
2,
3,
4
],
"string": "doc1"
},
{
"array": [
3,
4,
5
],
"string": "doc2"
}
]
与相比,我想找到在“数组”中具有最常见元素的文档[2,3,4]
。返回的文件应为:
{
"array": [
1,
2,
3,
4
],
"string": "doc1"
}
(3场比赛)
但是,如果搜索是[3,4,6]
返回的文档,则应为:
{
"array": [
3,
4,
5
],
"string": "doc2"
}
因为两者共享相同的匹配数(2),但是返回的文档包含较少的不匹配元素(1个元素与另一个文档上的2个元素相比)。
如何完成查找查询数组与文档数组的“最佳”交集的查询?
您可以使用$ setIntersection运算符来计算新数组,并根据其大小以及的大小来计算过滤器array
:
db.collection.aggregate([
{
$addFields: {
size: { $size: "$array" },
intersectionSize: { $size: { $setIntersection: [ [2,3,4], "$array" ] } }
}
},
{
$sort: {
intersectionSize: -1,
size: 1
}
},
{
$limit: 1
},
{
$project: {
size: 0,
intersectionSize: 0
}
}
])
编辑:按大小升序排序是必要的,因为如果存在相同数量的匹配元素,则较短的数组将被提升
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句