在单个mongodb查询中查找和计数
find and count in single mongodb query
我的文档如下所示。
{
"_id" : ObjectId("572c4bffd073dd581edae045"),
"name" : "What's New in PHP 7",
"description" : "PHP 7 is the first new major version number of PHP since 2004. This course shows what's new, and what's changed.",
"difficulty_level" : "Beginner",
"type" : "Normal",
"tagged_skills" : [
{
"_id" : "5714e894e09a0f7d804b2254",
"name" : "PHP"
}
],
"created_at" : 1462520831.649,
"updated_at" : 1468233074.243 }
是否可以在一个查询中获得最近的5个文档和总数。我使用两个查询来满足以下要求。
db.course.find().sort({created_at:-1}).limit(5)
db.course.count()
这是聚合框架的完美工作。
db.course.aggregate(
[
{ "$sort": { "created_at": -1 }},
{ "$group": {
"_id": null,
"docs": { "$push": "$$ROOT" },
"count": { "$sum": 1 }
}},
{ "$project": { "_id": 0, "count": 1, "docs": { "$slice": [ "$docs", 5 ] } }}
]
)
如果您的MongoDB服务器不支持$slice
,那么您需要使用丑陋且低效的方法。
db.course.aggregate(
[
{ "$sort": { "created_at": -1 }},
{ "$group": {
"_id": null,
"docs": { "$push": "$$ROOT" },
"count": { "$sum": 1 }
}},
{ "$unwind": "$docs" },
{ "$limit": 5 }
]
)
使用$facet
可以轻松实现
myCollection.aggregate([
{
$facet: {
count: [{ $count: "value" }],
data: [{ $sort: { _id: -1 } }, { $skip: skip }, { $limit: limit }]
}
},
{ $unwind: "$count" },
{ $set: { count: "$count.value" } }
])
返回结果将类似于:
[
{
"count": 234,
"data": [
// ...
]
}
]
@styvane我亲自测试过,这个查询的效率甚至低于两次查询。
// get count
db.course.aggregate([{$match:{}}, {$count: "count"}]);
// get docs
db.course.aggregate(
[
{$match:{}},
{ "$sort": { "created_at": -1 }},
{"$skip": offset},
{"$limit": limit}
]
)
不,没有其他方法。两个查询-一个用于计数-一个带有限制。
相关文章:
- 正在全局范围中查找JavaScript函数
- Javascript(Angular)从一个对象数组到第二个数组查找值
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- 是否可以禁用jquery中的单个单选按钮
- 如何使用与单个查找字段相关的信息填充字段
- Angularjs元素在一个调用中同时查找select和input-这是单个标记查找的极限
- Regex查找用方括号括起来的单个单词
- 查找字符串的单个匹配项,然后查找另一个模式的多个匹配项
- Javascript-查找属性的单个实例's在对象数组中的值
- Javascript:在字符串中查找单个字母出现次数最多的单词
- 在Javascript中从数组字符串中查找单个或多个值
- Javascript regexp:如何查找不以特定单词(不是单个字母)结尾的字符串
- 用于查找和替换的单个正则表达式
- 搜索脚本不查找单个单词
- 如何在Google maps API v3中的标记集群对象中查找单个集群中的标记
- 使用单个函数查找两个日期之间的差值
- 在单个mongodb查询中查找和计数
- 从单个数组中的多个值中查找单个值
- 查找单个元素上的所有数据属性