在下面的文档中,我想找到具有与条件
匹配的列的表对象(标签是'abc'或(名称是'abc',标签是空的))
{
"tables": [
{
"name": "table1",
"columns": [
{
"name": "abc",
"label": "xyz"
},
{
"name": "def",
"label": ""
}
]
},
{
"name": "table2",
"columns": [
{
"name": "xxx",
"label": "yyy"
},
{
"name": "zzz",
"label": "abc"
}
]
}
]
}
预期答案是table2对象。
以下查询返回table1和table2。我认为'match'子句不是逐列应用于整个列数组。我想把表对象作为最终结果,因此在列级别展开不是一个选项。
db.getCollection('test').aggregate(
{$unwind : "$tables"},
{"$match":
{"$or":
[
{"tables.columns.label": "abc"},
{"tables.columns.name":"abc", "tables.columns.label": ""}
]
}
}
)
如何逐列匹配?
答案 0 :(得分:2)
您应该使用$elemMatch
运算符:
db.getCollection('test').aggregate(
{
$unwind: "$tables"
},
{
$match:
{
"$or":
[
{
"tables.columns.label": "abc"
},
{
"tables.columns":
{
$elemMatch:
{
"name": "abc",
"label": ""
}
}
}
]
}
}
)