问题描述
我尝试在此嵌套结构中匹配文档,它适用于一级,但不适用于二级:
{
type:"example"
level1:[
{
name:"Bill"
level2:[
{
skill:"gardening"
},{
skill:"carpentry"
}
]
},{
name:"John"
level2:[
{
skill:"painting"
},{
skill:"acrobatics"
}
]
}
]
}
我可以匹配第一级数组,例如:
db.collection.find({"level1.name":{$eq:"Bill"}})
但是,例如,如果我想对技能范围等于“杂技”的文档进行数学计算,则可以这样做:
db.collection.find({"level1.level2.skill":{$eq:"acrobatics"}})
行不通,知道吗? (很抱歉,示例的命名没有太大意义,但这就是我要面对的结构。)
谢谢!
解决方法
有多种方法可以执行此操作。您可以尝试这样的事情。
-
$unwind
展平第一级数组 -
$match
以匹配您需要的元素 -
$group
分组回到同一级别
下面给出了Shell查询
[
{
"$unwind": "$level1"
},{
$match: {
"level1.level2.skill": "acrobatics"
}
},{
"$group": {
_id: "$_id",level1: {
"$addToSet": "$level1"
}
}
}
]