xer*_*iee 3 mongodb mongodb-query aggregation-framework
我想知道在 MongoDB 中是否可以执行以下操作。
我收集了一些文档,这些文档代表了某个时间值的变化:
{
"day" : ISODate("2018-12-31T23:00:00.000Z"),
"value": [some integer value]
}
Run Code Online (Sandbox Code Playgroud)
数据中没有“漏洞”,我有某个时期内所有天数的条目。
是否可以查询此集合以仅获取与前一个值不同的文档(按天 asc 排序时)?例如,有以下文件:
{
"day" : ISODate("2019-04-01T00:00:00.000Z"),
"value": 10
},
{
"day" : ISODate("2019-04-02T00:00:00.000Z"),
"value": 10
},
{
"day" : ISODate("2019-04-03T00:00:00.000Z"),
"value": 15
},
{
"day" : ISODate("2019-04-04T00:00:00.000Z"),
"value": 15
},
{
"day" : ISODate("2019-04-05T00:00:00.000Z"),
"value": 15
},
{
"day" : ISODate("2019-04-06T00:00:00.000Z"),
"value": 10
}
Run Code Online (Sandbox Code Playgroud)
我想检索 2018-04-01、2018-04-03 和 2018-04-06 的文档。
我再次发布这个问题,因为前一个被错误地标记为重复。
您需要获得成对的连续文档来检测差距。为此,您可以将所有文档推送到单个数组中,并将其压缩为从头部移动 1 个元素:
db.collection.aggregate([
{ $sort: { day: 1 } },
{ $group: { _id: null, docs: { $push: "$$ROOT" } } },
{ $project: {
pair: { $zip: {
inputs:[ { $concatArrays: [ [false], "$docs" ] }, "$docs" ]
} }
} },
{ $unwind: "$pair" },
{ $project: {
prev: { $arrayElemAt: [ "$pair", 0 ] },
next: { $arrayElemAt: [ "$pair", 1 ] }
} },
{ $match: {
$expr: { $ne: ["$prev.value", "$next.value"] }
} },
{ $replaceRoot:{ newRoot: "$next" } }
])
Run Code Online (Sandbox Code Playgroud)
其余的都是微不足道的 - 您将数组展开回文档,比较对,过滤掉相等的对,并从剩下的替换根。