过滤MongoDB中的嵌入式数组

时间:2014-05-12 16:22:47

标签: arrays mongodb mongoose

我有一个Mongodb文档,其中包含一个深深嵌入文档中的数组。在我的一个操作中,我想返回整个文档,但过滤掉那个与该标准不匹配的数组元素。

以下是一些简化数据:

{
   id: 123 ,
   vehicles : [
     {name: 'Mercedes', listed: true},
     {name: 'Nissan', listed: false},
     ...
   ]
}

因此,在此示例中,我想要整个文档,但我希望vehicles数组只包含listed属性设置为true的对象。

解决方案

理想情况下,我正在寻找使用mongo查询的解决方案(例如`$ unwind,$ elemMatch等...)但我也使用mongoose所以使用Mongoose的解决方案是可以的。

2 个答案:

答案 0 :(得分:3)

您可以使用这样的聚合框架:

db.test312.aggregate(
    {$unwind:"$vehicles"},
    {$match:{"vehicles.name":"Nissan"}},
    {$group:{_id:"$_id",vehicles:{$push:"$vehicles"}}}
)

答案 1 :(得分:1)

您可以在展开的equals true展开和匹配后对组使用$addToSet

示例shell查询:

db.collection.aggregate([
{
    $unwind: "$vehicles"
},
{
    $match: {
        "vehicles.listed": {
            $eq: true
        }
    }
},
{
    $group: {
        _id: "$id",
        vehicles: {
            "$addToSet": {
                name: "$vehicles.name",
                listed: "$vehicles.listed"
            }
        }
    }
},
{
    $project: {
        _id: 0,
        id: "$_id",
        vehicles: 1
    }
}
]).pretty();