从属于一个文档(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数组,并指定了distinct
search,它只显示文档的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的元素。