如何在Mongoose.find中仅选择数组的元素

时间:2017-07-10 15:40:56

标签: javascript node.js mongodb mongoose

假设我在数据库中有这些值:

{
    name: '1',
    values: [{
        subname: 'awesome'
    }, {
        surname: 'cool'
    }]
}

我怎么能只用我感兴趣的值过滤数组?

我希望得到我的发现:

{
    name: '1',
    values: [{
        subname: 'awesome'
    }]
}

我想也许有选择的可能性?像

这样的东西
MyCollection.find({name: '1'}).select(BLACK_MAGIC);

BLACK_MAGIC使用我感兴趣的值过滤我的数组,在此示例中,values.subname ='awesome'

预先提出任何想法

旁注:我很有兴趣使用Mongoose查询和函数解决这个问题,而不是在结果数组上使用post javascript解决方案

1 个答案:

答案 0 :(得分:1)

我认为您可以使用aggregation

您希望$unwind以便每个values对象都在一个单独的文档中。

然后使用$match过滤结果。

MyCollection.aggregate([
    {
        $unwind: '$values'
    },
    {
        $match: { 
            'values.subname': 'awesome'
        }
    },
    // EDIT
    {
        $group: {
            _id: '$_id',
            name: { 
                $first: "$name"
            },
            values: {
                $push: { subname: "$values.subname" }
            }
         }
    }
], function (err, results) {

});

如果它有效,你就会更近一点。唯一的事情是values是一个对象,而不是一个对象的数组。您可以将$group$first一起使用以获得所需的结果。