gpt4 book ai didi

mongodb - 如何对mongo中的后续元素进行分组?

转载 作者:可可西里 更新时间:2023-11-01 09:14:40 26 4
gpt4 key购买 nike

如何在 mongo 中按属性对后续元素进行分组。这是我的 mongo 文档(事件),我希望能够按类型对它们进行子顺序分组。

{
"_id" : ObjectId("5d1b68d708f3870049d9cc37"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"id" : "76800453-e72e-410b-accc-cf47cd2773a1",
"type" : "controller_connection_status",
"timestamp" : 1562077399832.0,

}

/* 2 */
{
"_id" : ObjectId("5d1b68db08f3870049d9cc39"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"id" : "fabd883c-6971-4977-b3fc-31679c2b85dd",
"type" : "controller_connection_status",
"timestamp" : 1562077402916.0,
}

/* 3 */
{
"_id" : ObjectId("5d1b68db08f3870049d9cc3a"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"siteId" : "226168be-866c-11e8-adc0-fa7ae01bbebc",
"id" : "98decbea-8288-4df5-807d-14e90f929df2",
"type" : "controller_added",
"timestamp" : 1562077402920.0,
}

/* 4 */
{
"_id" : ObjectId("5d1b690908f3870049d9cc3c"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"id" : "b5ad6199-8805-43fd-bd7e-80f0410e744a",
"type" : "controller_connection_status",
"timestamp" : 1562077449904.0,
}

/* 5 */
{
"_id" : ObjectId("5d1b690d08f3870049d9cc3d"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"id" : "276ea325-0eec-47a2-8e0e-3805ed34b80b",
"type" : "controller_error",
"timestamp" : 1562077452975.0,
}

/* 6 */
{
"_id" : ObjectId("5d1b694508f3870049d9cc3f"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"id" : "03ce803b-6b2e-49fe-8f0d-4feee44251e9",
"type" : "controller_error",
"timestamp" : 1562077509904.0,
}

/* 7 */
{
"_id" : ObjectId("5d1b694908f3870049d9cc41"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"id" : "b144a04f-8201-4945-b2c4-faef5b41866e",
"type" : "controller_connection_status",
"timestamp" : 1562077512974.0,
}

/* 8 */
{
"_id" : ObjectId("5d1b698208f3870049d9cc42"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"id" : "235874f3-c017-4ea8-abaf-8c5edf1b317a",
"type" : "controller_connection_status",
"timestamp" : 1562077569903.0,
}

/* 9 */
{
"_id" : ObjectId("5d1b698508f3870049d9cc43"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"id" : "4fb3706f-d195-4ded-87b9-8482c712825c",
"type" : "controller_connection_status",
"timestamp" : 1562077572973.0,
"createdAt" : ISODate("2019-07-02T14:26:13.120Z"),
"updatedAt" : ISODate("2019-07-02T14:26:13.120Z"),
"__v" : 0
}

/* 10 */
{
"_id" : ObjectId("5d1b69bd08f3870049d9cc45"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"id" : "e743baef-1701-436a-baf2-8367a0917c81",
"type" : "controller_removed",
"timestamp" : 1562077629903.0,
}

我想要的输出:

timestamp         type                                               count
(last timestamp) controller_connection_status 2
-- controller_added 1
-- controller_connection_status 1
-- controller_error 2
-- controller_connection_status 3
-- controller_removed 1

到目前为止我已经尝试过:

db.getCollection('events').aggregate([
{
'$match': {
'controllerId': '80058c2b-9525-4f7f-8e26-faea4ad92b15'
}
},
{
'$group': {
'_id': '$type',
'type': {
'$first': '$type'
},
'timestamp': {
'$last': '$timestamp'
},
'count': {
'$sum': 1,
}
}
},
{
'$sort': {
'timestamp': -1
}
}
])

我的输出:

timestamp         type                                               count
(last timestamp) controller_connection_status 6
-- controller_added 1
-- controller_error 2
-- controller_removed 1

最佳答案

您可以使用 $graphLookup将顺序文档分组到数组中。它需要一个集合来查找,在你的情况下它可以是 view .

该 View 使用 $zip 聚合前后对中的文档运算符(operator):

db.createView("events-view", "original_collection", [
{ $sort: { timestamp: 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 ] }
} },
{ $project: {
_id: "$prev._id",
prev: 1,
next: 1,
sameType: { $eq: ["$prev.type", "$next.type"] }
} },
]);

它应该如下所示:

{
"prev" : false,
"next" : {
"_id" : ObjectId("5d1b68d708f3870049d9cc37"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"id" : "76800453-e72e-410b-accc-cf47cd2773a1",
"type" : "controller_connection_status",
"timestamp" : 1562077399832.0
},
"sameType" : false
},
{
"prev" : {
"_id" : ObjectId("5d1b68d708f3870049d9cc37"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"id" : "76800453-e72e-410b-accc-cf47cd2773a1",
"type" : "controller_connection_status",
"timestamp" : 1562077399832.0
},
"next" : {
"_id" : ObjectId("5d1b68db08f3870049d9cc39"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"id" : "fabd883c-6971-4977-b3fc-31679c2b85dd",
"type" : "controller_connection_status",
"timestamp" : 1562077402916.0
},
"_id" : ObjectId("5d1b68d708f3870049d9cc37"),
"sameType" : true
},
{
"prev" : {
"_id" : ObjectId("5d1b68db08f3870049d9cc39"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"id" : "fabd883c-6971-4977-b3fc-31679c2b85dd",
"type" : "controller_connection_status",
"timestamp" : 1562077402916.0
},
"next" : {
"_id" : ObjectId("5d1b68db08f3870049d9cc3a"),
"controllerId" : "80058c2b-9525-4f7f-8e26-faea4ad92b15",
"siteId" : "226168be-866c-11e8-adc0-fa7ae01bbebc",
"id" : "98decbea-8288-4df5-807d-14e90f929df2",
"type" : "controller_added",
"timestamp" : 1562077402920.0
},
"_id" : ObjectId("5d1b68db08f3870049d9cc39"),
"sameType" : false
},
etc...

然后您可以按类型和最新时间​​戳查询 View 分组文档,直到“sameType”条件成立。最长的文档链是您要查找的计数:

db.getCollection("events-view").aggregate([
{ $graphLookup: {
from: "events-view",
startWith: "$next._id",
connectFromField: "next._id",
connectToField: "_id",
restrictSearchWithMatch: { "sameType": true },
as: "chain"
} },
{ $project: {
_id: "$next._id",
type: "$next.type",
chain: { $concatArrays: [ [{ next: "$next" }], "$chain" ] }
} },
{ $addFields: {
chainLength: { $size: "$chain" },
timestamp: { $max: { $map: {
input: "$chain",
in: "$$this.next.timestamp"
} } }
} },
{ $group: {
_id: {type: "$type", timestamp: "$timestamp"},
count: {$max: "$chainLength"}
} },
{ $sort: { "_id.timestamp": 1 } },
{ $project: {
_id: 0,
timestamp: "$_id.timestamp",
type: "$_id.type",
count: 1
} }
])

应该提到的是查询会很慢。链越长性能越差。另请记住,$graphLookup 阶段必须保持在 100 兆字节的内存限制内。对于较大的集合,您应该将 allowDiskUse 选项设置为 true

关于mongodb - 如何对mongo中的后续元素进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56933839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com