我有一个包含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
指定了该搜索,因此它只显示了文档的Friends数组。我只需要访问包含指定id的那个数组的一个元素。不像在代码中完成的那样在查询之后过滤那个数组,有没有办法只从查询中获取元素?换句话说,是否有一个额外的功能来区分或某种类型的猫鼬运算符,允许这样做?
User.findOne().distinct('Friends', { id: req.body.myId }).then(function(myDoc) {
var friendAtt = myDoc.filter(function(obj) {
return obj.id == req.body.id
})[0]
})
答案 0 :(得分:4)
您在这里真的不需要distinct
,您可以在find()
上使用Friends.id
,并使用the positional parameter $
过滤与Friends.id
匹配的第一个子文档:
db.user.find(
{ 'id': 'id1', 'Friends.id': 'id2'},
{ 'Friends.$': 1 }
)
在猫鼬中:
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);
})
答案 1 :(得分:2)
感谢bertrand我能够找到答案在于Projection
'。在mongodb中它是$
',在mongoose中select
。以下是我的工作方式:
User.findOne({id: req.body.myId}).select({ Friends: {$elemMatch: {id: req.body.id}}}),
它只返回与friends中指定的id匹配的元素。