2017-04-20 121 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

謝謝,我會繼續使用舊的語法!我需要正則表達式。 –