使用MongoDB聚合查询匹配集合中的特定项

时间:2015-11-09 09:28:02

标签: mongodb aggregation-framework

在下面的文档中,我想找到具有与条件

匹配的列的表对象
  

(标签是'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": ""}
                    ]
                }
            }
)

如何逐列匹配?

1 个答案:

答案 0 :(得分:2)

您应该使用$elemMatch运算符:

db.getCollection('test').aggregate(
    {
        $unwind: "$tables"
    },
    {
        $match:
        {
            "$or":
            [
                {
                    "tables.columns.label": "abc"
                },
                {
                    "tables.columns":
                    {
                        $elemMatch:
                        {
                            "name": "abc",
                            "label": ""
                        }
                    }
                }
            ]
        }
    }
)