从属于一个文档(mongoose)的一部分对象中获取一个元素

我有一个包含Friends的模式。 Friends是一个数组,其中每个元素都是一个包含id,gender和emoji的对象。

 var userSchema = new Schema({ id: { type: String, unique: true, required: true }, gender: String, Friends: [{ id: String gender: String emoji: String }] }); 

在下面的代码中,我正在访问一个文档,其中包含一个Friends数组,并指定了distinctsearch,它只显示文档的Friends数组。 我只需要访问该数组中包含一个指定的ID的一个元素。 而不是像在代码中所做的那样在查询之后过滤数组,是否有一种方法可以纯粹从查询中获取元素? 换句话说,是否有额外的function不同或某种mongoose运算符,允许?

 User.findOne().distinct('Friends', { id: req.body.myId }).then(function(myDoc) { var friendAtt = myDoc.filter(function(obj) { return obj.id == req.body.id })[0] }) 

在这里你并不需要distinct ,你可以在Friends.id上使用find() ,并用位置参数$ :筛选与Friends.id相匹配的第一Friends.id文档。

 db.user.find( { 'id': 'id1', 'Friends.id': 'id2'}, { 'Friends.$': 1 } ) 

在mongoose:

 User.find({ 'id': req.body.myId, 'Friends.id': req.body.id }, { 'Friends.$': 1 }).then(function(myDoc) { console.log("_id :" + myDoc[0].Friends[0].id); console.log("gender:" + myDoc[0].Friends[0].gender); }) 

感谢伯特兰德,我能够发现答案在于“ Projection ”。 在mongodb中,它是' $ ',以mongoose的select 。 以下是我如何工作:

 User.findOne({id: req.body.myId}).select({ Friends: {$elemMatch: {id: req.body.id}}}), 

它只返回匹配在朋友中指定的ID的元素。