从一个对象数组中获取一个元素,这些对象是一个文档的一部分(猫鼬)

时间:2016-12-28 00:23:26

标签: node.js mongodb mongoose mongodb-query

我有一个包含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]

})

2 个答案:

答案 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匹配的元素。