2017-08-07 21 views
0

我想通过id查询一个用户,然后只带一个类型匹配的食物,我该怎么做?mongoose FindbyId和数组匹配到一个字符串

var type = 'fish'; 

var id = '597a348286ffe50d882a3033'; 

User.findById(id, { 'food.type': type }, 'food', function(err, model) { 

    if (err) { 

     console.log(err); 

    } 
    if (!model) { 

     console.log('no model'); 
    } 

    if (model) { 

     console.log(model); 

    } 

}); 
+0

文档的结构如何? – Dario

+0

'VAR用户= mongoose.Schema({ \t \t 名:字符串, \t电话:字符串, \t电子邮件:字符串, \t食品:[{ \t 类型:字符串, 名:字符串, \t价格:字符串 \t \t}] } – John

回答

0

只是在得到用户后过滤食物。

User.findById(id, function (err, user) { 
    if (err) { 
     console.log(err); 
    } 
    if (!user) { 
     console.log('no user'); 
    } 
    if (user) { 
     var food = user.food.filter(function (food) { return food.type === type; }); 
    } 
}); 
0

我会用aggregate$filter结合:

User.aggregate([{ 
     $match: { '_id': ObjectId('597a348286ffe50d882a3033') } 
    }, { 
     $project: 
     { 
      food: { 
       $filter: { 
        input: '$food', 
        as: 'food', 
        cond: { 
         $eq: ['$$food.type', type] 
        } 
       } 
      } 
     } 
    }]) 

这将首先选择匹配,然后指定ID将返回给定类型的食物列表中的文件。

0

您可以创建一个OBJ这样的

var obj = 
{ 
_id:'597a348286ffe50d882a3033', 
'food.type' : 'fish' 
} 

,然后通过这个功能作为过滤

User.find(obj, function(err, model) { 

    if (err) { 

     console.log(err); 

    } 
    // find will return empty array and not null 
    if (!model.length) { 

     console.log('no model'); 
    } 

    if (model) { 

     console.log(model); 

    } 

}); 
0

如果您正在使用蒙戈_id字段,你不必使用查找对象查询执行后附加的过滤功能,您直接在搜索查询中指定

Model.findOne({_id: '123jasdoisd123', 'food.type': type }, 
    function(err, food){ 
    if(err) return err; 
    if(!food){ 
     // send the empty data 
    return [] 
    } 
    return food; 
    } 

相关问题