计算与MongoDB中的子数组条件匹配的文档

时间:2017-01-04 01:35:50

标签: mongodb laravel

我有一个数据库,其中许多文档的结构类似于:

{
   "_id" : ObjectId("586c0f07d0ad7a2b8b08c572"),
   "auto_vehicles" : [ 
       {
           "year" : "2017",
           "make" : "SUBARU",
       },
       {
           "year" : "2011",
           "make" : "CHEVROLET",            
       }
   ],
   "created_at" : ISODate("2017-01-03T20:52:23.192Z")
}

假设我想要计算所有“auto_vehicles.make”等于“SUBARU”的文档,我试图执行以下操作:

collection.find({ 'auto_vehicles.make': 'SUBARU'})。计数();

但返回的值似乎不正确(实质上不足以代表实际的数据库群)。

我怀疑也许find不会在这样的子数组中搜索?

其他信息:我通过Laravel 5.2执行这些查询w / Jenssegers MongoDB Eloquent模型和来自https://jenssegers.com/的查询构建器(Moloquent)

非常感谢您的想法 - 谢谢

1 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情。您需要对所有文档进行聚合,因为您需要对所有文档进行计数。

$ match仅保留具有匹配make的嵌入式数组。

$展开嵌入式数组

$ match只保留匹配的品牌。

$ group来匹配make。

db.collection.aggregate([{
    $match: {
        "auto_vehicles.make": 'SUBARU'
    }
}, {
    $unwind: "$auto_vehicles"
},
{
    $match: {
        "auto_vehicles.make": 'SUBARU'
    }
},{
    $group: {
        _id: "$auto_vehicles.make",
        count: {
            $sum: 1
        }
    }
}]);

更新

$过滤到符合条件的嵌入式文档。

db.collection.aggregate([{
    "$project": {
        "_id": 1,
        "auto_vehicles": {
            "$filter": {
                "input": "$auto_vehicles",
                "as": "result",
                "cond": {
                    "$eq": ["$$result.make", 'SUBARU']
                }
            }
        }
    }
}, {
    $unwind: "$auto_vehicles"
}, {
    $group: {
        _id: "$auto_vehicles.make",
        count: {
            $sum: 1
        }
    }
}]);