Mongo $ aggregate和$ filter无效

时间:2017-04-20 08:02:46

标签: mongodb filter aggregation-framework

我在过滤特定文档的值数组时遇到了问题。 集合名称是列表,我是一个带有'字段'的文档。作为_id。 以下是文档的一部分:

{
"_id" : "fields",
"values" : [ 
    {
        "name" : "sku",
        "dt" : "text"
    }, 
    {
        "name" : "title",
        "dt" : "text"
    }, 
    {
        "name" : "desc",
        "dt" : "text"
    }, 
    {
        "name" : "brand",
        "dt" : "text"
    }, 
    {
        "name" : "cur",
        "dt" : "text"
    }, 
    {
        "name" : "l_img",
        "dt" : "text"
    }, 
    .....
    ]
}

我需要检索与指定正则表达式匹配的字符串数组。

这是我的疑问:

db.lists.aggregate([
{
    $match : { _id: "fields"}
},
{
    $project: {
       values: {
          $filter: {
             input: "$values",
             as: "val",
             cond: { "$$val.name" : { $regex: /sk/i } }
          }
       }
    }
 }
]);

这是我得到的错误:

断言:命令失败:{" ok" :0," errmsg" :"无效的运营商' $$ val.name'","代码" :15999}:聚合失败

我尝试了帖子How to filter array in subdocument with MongoDB的情况并且它工作正常,但是根据我的需求和文档结构实现的却没有。我在哪里做错了?

最早的语法(以前的3.2版本)运行良好:

db.lists.aggregate(
{ $match: {_id: "fields"}},
{ $unwind: '$values'},
{ $match: {'values.name': { $regex: /sk/i }}},
{ $group: {_id: '$_id', values: {$push: '$values.name'}}})

事实上我得到了:

{ "_id" : "fields", "values" : [ "sku", "sku_parent", "skin_type", "skin_tone" ] }

我的mongo db版本是3.2.9。

1 个答案:

答案 0 :(得分:0)

问题似乎不是正则表达式:

db.lists.aggregate([
{
   $match : { _id: "fields"}
},
{
   $project: {
      values: {
        $filter: {
           input: "$values",
           as: "val",
           cond: { "$$val.name" : "sku" }
        }
     }
   }
}
]);

断言:命令失败:{" ok" :0," errmsg" :"无效的运营商' $$ val.name'","代码" :15999}:聚合失败