mongodb - 计算行数并仅获取 MongoDB 中的最后一行
问题描述
我有一系列帖子如下:
{
"author": "Rothfuss",
"text": "Name of the Wind",
"likes": 1007,
"date": ISODate("2013-03-20T11:30:05Z")
},
{
"author": "Rothfuss",
"text": "Doors of Stone",
"likes": 1,
"date": ISODate("2051-03-20T11:30:05Z")
}
我想计算每个作者的帖子和他/她最后的帖子。这里有同样问题的 SQL 答案。我试图找到它的 MongoDB 替代品。
到目前为止,我结束了这个查询:
db.collection.aggregate([
{
"$group": {
"_id": "$author",
"count": {
"$sum": 1
},
"lastPost": {
"$max": {
"_id": "$date",
"post": "$text"
}
}
}
}
])
这似乎有效,但它的不同运行会产生不同的结果。它可以在 Mongo 操场上进行测试。我不明白如何使用$max
从包含最大值的文档中选择另一个属性。我是 MongoDB 的新手,所以对基础知识的描述也很受欢迎。
额外的问题
是否可以限制$sum
只添加likes
超过 100 个的帖子?
解决方案
它的不同运行会产生不同的结果。
我不明白如何使用 $max 从包含最大值的文档中选择另一个属性。
$max
不适用于多个字段,并且在具有文本/字符串值的字段中也无效。
它将从一组帖子中选择任何属性,每次都会有所不同。
所以准确的结果你可以在stage$sort
之前添加新的stage $group
,按日期降序排序,在group stage中你可以通过$first
运算符选择一个值,
{ $sort: { date: -1 } },
{
$group: {
_id: "$author",
count: { $sum: 1 },
date: { $first: "$date" },
post: { $first: "$text" }
}
}
是否可以限制
$sum
只添加likes
超过 100 个的帖子?
您的要求有两个含义,我不确定您要问的是哪个,但让我给出两个解决方案,
- 如果您只是不想计算帖子,
count
但您想将其作为最后一个帖子date
,text
如果是的话。
$cond
检查条件如果likes
大于 100 则计数 1 否则计数 0
db.collection.aggregate([
{ $sort: { date: -1 } },
{
$group: {
_id: "$author",
count: {
$sum: {
$cond: [{ $gt: ["$likes", 100] }, 1, 0]
}
},
date: { $first: "$date" },
post: { $first: "$text" }
}
}
])
- 如果你不想数数,也不想最后一个帖子,如果是的话。
- 您可以
$match
在第一阶段添加一个阶段以检查大于条件,您的最终查询将是,
db.collection.aggregate([
{ $match: { likes: { $gt: 100 } } },
{ $sort: { date: -1 } },
{
$group: {
_id: "$author",
count: { $sum: 1 },
date: { $first: "$date" },
post: { $first: "$text" }
}
}
])
推荐阅读
- sql - 递归自加入 Redshift?
- c++ - “打印一个数组”如何改变另一个数组的值?
- azure-devops - Azure DevOps 中是否有一个变量来检查构建是否来自门控签入?
- android - 如何在服务类的特定位置动态更新recyclerview项目?
- javascript - 两个 HTML 按钮的设置方式相同,但一个不起作用
- xsd - XSD - 2 个节点的 XNOR 门
- jmeter-5.0 - Jmeter - 在负载下不会发生重定向
- css - 如何更改 v-text-field 中的占位符/标签颜色?
- angular - 在所有数据完成之前加载 Angular Page
- c# - 使用 asp.net 将文件从一个位置复制到解决方案资源管理器中的文件夹