2016-03-02 108 views
3

我試圖找到(使用正則表達式)的陣列場$過濾器並返回該元素只有正則表達式作爲投影

這是我的數據

[ 
{ 
"_id": "56d6e8bbf7404bd80a017edb", 
"name": "document1", 
"tags": [ 
    "A area1", 
    "B area2", 
    "C area3" 
] 
}, 
{ 
"_id": "56d6e8bbf7404bd82d017ede", 
"name": "document2", 
"tags": [ 
    "b_area3", 
    "b_area4", 
    "b_area5" 
    ] 
} 
] 

我查詢

var query=new RegExp('^'+string, "i"); 

Model.find({tags:query},{'tags.$': 1}, function(err,data){ 
     if(err) console.log(err); 
     res.json(data); 
    }); 

此查詢只選擇標籤字段(如我所願),但選擇第一個元素。我需要匹配查詢的元素。

編輯:我也試過mongodb聚合,$ filter cond是錯誤的。我得到的錯誤「MongoError:無效操作$正則表達式」

caseNote.aggregate([ 
    { $match: {tags:query}}, 
    { $project: { 
     tags: {$filter: { 
      input: 'tags', 
      as: 'item', 
      cond: {$regex: ['$$item', query]} 
     }} 
    }} 
], function (err, result) { 
    if (err) { 
     console.log(err); 
    } else { 
     res.json(result); 
    } 
}); 

EDIT2:在@zangw的建議,這是貓鼬的版本,但它是不完整的:標籤領域是好的(需要測試) ,但查詢仍然返回整個文檔。

caseNote 
    .aggregate({ $match: {tags: {$in:['area3']}}}) 
    .unwind('tags') 
    .exec(function(err,d){ 
     res.json(d); 
    }); 

回答

3

根據這個問題Use $regex as the expression in a $cond,則$regex不能與cond用於電流蒙戈版本。

也許你可以試試這個,過濾area3通過$match,然後通過$group得到所有匹配的標籤,然後通過$project刪除_id

caseNote.aggregate([{$unwind: '$tags'}, 
       {$match: {tags: /area3/}}, 
       {$group: {_id: null, tags: {$push: '$tags'}}}, 
       {$project: {tags: 1, _id: 0}}]) 
    .exec(function(err, tags) { 
     if (err) 
      console.log(err); 
     else 
      console.log(tags); 
    }); 

結果:

{ "tags" : [ "C area3", "b_area3" ] } 
+0

請參考我的編輯以上 – alfredopacino

+0

@ the.websurfer,請儘量先放鬆,然後做'$ match' ... – zangw

+0

@ the.websurfer,我有用測試數據更新了我的答案。您之前的代碼不會遵循我的回答... – zangw