2017-04-20 108 views
0

我在过滤特定文档的值数组时遇到问题。 集合名称是列表,我有一个'fields'为_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'“,”code“: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" ] } 

我蒙戈DB版本3.2.9是。

+0

你尝试把只有一个$在$$ val.name –

+0

$正则表达式不支持表达过滤器,尝试用它工作 – AshokGK

+0

嗨AshokGK其他表达式,这个问题似乎不是正则表达式:看到我的后续文章 –

回答

0

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

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

断言:命令失败:{ “OK”:0, “ERRMSG”: “无效的操作 '$$ val.name'”,“代码”:15999}:总失败

+1

问题在于你的'cond'。尝试'cond:{$ eq:[“$$ $$.name”,“sku”]}'正则表达式在'$ project'中不受支持。 https://jira.mongodb.org/browse/SERVER-11947&http://jira.mongodb.org/browse/SERVER-8892 – Veeram

+0

谢谢,我会继续使用旧的语法!我需要正则表达式。 –