2016-03-02 111 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