我有一个数据库,其中许多文档的结构类似于:
{
"_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)
非常感谢您的想法 - 谢谢
答案 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
}
}
}]);