我有一个包含字符串数组的文档的数据库。类似于文档{name: "Test", keys: [["key1","key2"],["key3"],["key4", key5","key6"],["key7"]]}的东西
给定一个键列表,我希望查询数据库中每个子数组中至少有一个键的所有文档。因此,如果我要求提供所有给定键列表的文档:"key1“、"key3”、"key5“、"key7”、"key9“,则会返回上述文档,因为所有内部数组至少有一个来自查询的键。
但是,如果给出诸如"key1“、"key3”、"key7“、"key9”等键的列表,则不会返回上述文档,因为第三个内部数组不包含其中一个键。
我做了很多研究,但没有办法做到这一点。我不知道这是否可能。但是,所有的投入将是非常感谢的。谢谢!
发布于 2020-11-29 05:03:34
诀窍是
$keys获取$map与用户给定值之间的所有相交值。同时也得到了总数。$filter删除所有非元素数组,并获取计数$match检查两个计数,如果两个计数相同,则可以检索文档,否则删除文档。剧本是
db.collection.aggregate([
{
$addFields: {
dupkeys: {
"$map": {
input: "$keys",
in: {
"$setIntersection": [
"$$this",
["key3","key1", "key4","key7"]
]
}
}
},
total: { $size: "$keys" }
}
},
{
$addFields: {
nonMatched: {
$size: {
$filter: {
input: "$dupkeys",
cond: {
$ne: [ "$$this", [] ]
}
}
}
}
}
},
{
$match: {
$expr: {
$eq: ["$total", "$nonMatched" ]
}
}
}
])Working 蒙戈游乐场
https://stackoverflow.com/questions/65057023
复制相似问题