[英]Complex Mongo query in Python
我有一個名為measurements
的集合。 在這個集合中,只有三個字段: id
(univoque)、 tmstamp
(univoque) 和value
。 包含大於 0 的值的每一行都被視為警報。 從零狀態到下一個零狀態發生的所有警報都被視為一個事件。 我想以它以劇集格式返回數據的方式查詢數據。 也就是說,每一行都是一個情節。
為了更容易理解,我舉個例子:
{"id":1, tmstamp:1577644027, value:0}
{"id":2, tmstamp:1577644028, value:0}
{"id":3, tmstamp:1577644029, value:1}
{"id":4, tmstamp:1577644030, value:1}
{"id":5, tmstamp:1577644031, value:2}
{"id":6, tmstamp:1577644032, value:2}
{"id":7, tmstamp:1577644033, value:3}
{"id":8, tmstamp:1577644034, value:2}
{"id":9, tmstamp:1577644035, value:1}
{"id":10, tmstamp:1577644036, value:0}
{"id":11, tmstamp:1577644037, value:1}
{"id":12, tmstamp:1577644038, value:1}
{"id":13, tmstamp:1577644039, value:1}
{"id":14, tmstamp:1577644040, value:0}
鑒於這些數據,劇集將是:
episode1
:
{"id":3, tmstamp:1577644029, value:1}
{"id":4, tmstamp:1577644030, value:1}
{"id":5, tmstamp:1577644031, value:2}
{"id":6, tmstamp:1577644032, value:2}
{"id":7, tmstamp:1577644033, value:3}
{"id":8, tmstamp:1577644034, value:2}
{"id":9, tmstamp:1577644035, value:1}
episode2
:
{"id":11, tmstamp:1577644037, value:1}
{"id":12, tmstamp:1577644038, value:1}
{"id":13, tmstamp:1577644039, value:1}
我的問題是:有沒有什么方法可以在Mongo中查詢數據,從而獲得這種格式的結果,而不必在查詢本身之后進行這些操作?
您需要結合$facet
和Array expression operators
。
正如@aws_apprentice提到的,如果您知道以前的零狀態度量 id's , $bucket
會為您做這件事,因為邊界不接受表達式。
因此,我們需要將零狀態和非零狀態數據分開。 讓我們稱它們為:警報(值 = 0)和劇集(值 > 1)。
對於alerts
,我們將每個帶有警報的測量值的_id
存儲到數組中(我們需要它來過濾劇集)。 使用$indexOfArray
和$arrayElemAt
我們可以獲取下一個 _id i+1
(過濾i
和i+1
id 之間的劇集)。
假設
我已將id
替換為_id
以執行聚合
你知道如何用Python
語法翻譯 MongoDB 聚合命令
db.measurements.aggregate([
{
$facet: {
alerts: [
{
$match: {
value: 0
}
},
{
$group: {
_id: "",
ids: {
$push: "$_id"
}
}
}
],
episodes: [
{
$match: {
value: {
$gt: 0
}
}
}
]
}
},
{
$unwind: "$alerts"
},
{
$addFields: {
alert_idx: "$alerts.ids"
}
},
{
$unwind: "$alerts.ids"
},
{
$project: {
"k": {
$concat: [
"Episode",
{
$toString: {
$indexOfArray: [
"$alert_idx",
"$alerts.ids"
]
}
}
]
},
"v": {
$filter: {
input: "$episodes",
cond: {
$and: [
{
$gt: [
"$$this._id",
"$alerts.ids"
]
},
{
$lt: [
"$$this._id",
{
$arrayElemAt: [
"$alert_idx",
{
$sum: [
{
$indexOfArray: [
"$alert_idx",
"$alerts.ids"
]
},
1
]
}
]
}
]
}
]
}
}
}
}
},
{
$match: {
"v": {
$ne: []
}
}
}
])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.