mongodb - MongoDB:只保留第一个日期
问题描述
我正在寻找使用 mongoDB 减少/过滤数组以仅获取第一个日期(如果为空则没有)的最简单和适当的解决方案。
实际上,这是我的查询:
$project {
firstAction:{
$reduce:{
"input": { $setUnion: ["$fundraisingLog", "$missionLog", "$createdExperiencesLog", "$subscribedExperiencesLog", "$contributionLog"] },
"initialValue":"01.01.2099",
"in":{
$cond:[
{
$gt:[
{
$dateFromString:{
"dateString":"$$value",
"format":"%d.%m.%Y"
}
},
{
$dateFromString:{
"dateString":"$$this",
"format":"%d.%m.%Y"
}
}
]
},
"$$this",
"$$value"
]
}
}
}
这几乎是完美的,期望如果数组
$setUnion: ["$fundraisingLog", "$missionLog", "$createdExperiencesLog", "$subscribedExperiencesLog", "$contributionLog"]
是空的,我得到“01.01.2099”作为结果,而不是 null 或空结果。
解决方案
如果输入数组为空,则默认情况下$reduce
将产生initialValue。
如果您无法按上述查询或任何其他查询进行排序,那么我建议您尝试一下(这应该适用于空):
样本文件:
/* 1 */
{
"_id" : ObjectId("5d89113d5a0d22d3c8d2aad0"),
"actionLog" : [
"01.01.2014",
"11.01.2014",
"09.01.2014",
"09.09.2014",
"11.01.2015"
]
}
数据库查询:
db.yourCollection.aggregate([{ $project: { _id: 0 } }, { $unwind: '$actionLog' , preserveNullAndEmptyArrays: true },
{ $project: { actionLog: { $dateFromString: { dateString: '$actionLog', format: "%d.%m.%Y" } } } }, { $sort: { actionLog: -1 } }, { $limit: 1 }, {
$project: {
actionLog: { $dateToString: { format: "%d.%m.%Y", date: "$actionLog" } }
}
}])
结果 :
/* 1 */
{
"actionLog" : "11.01.2015"
}
推荐阅读
- react-native - 在 React Native 中为持久会话设置访问令牌到 redux 状态是否安全?
- r - 具有孤立顶点/节点的归一化度中心性度量(r igraph)
- c# - 如何摆脱图表winforms系列前后的空间?
- azure-active-directory - 微软登录。你不能从这里到达那里。有条件的访问。需要批准的客户端应用程序
- gatsby - 使用 Gatsby 和 Tailwind (PostCSS) 的自托管字体
- reactjs - 带有多形式步进器的 React 路由器
- elasticsearch - Elasticsearch:使用 OR 过滤多个字段
- powershell - 简单的 Powershell 和 soap 语法公共语言规范错误
- python - 使用 IP 地址计算 RTT
- java - 使大对象可迭代