0

我的应用程序在 MongoDB 集合中记录了一些数据。有三种类型的事件:'event1'、'event2'、'event3'。并且这些元素会定期添加。事件结构示例:

{ 'Data' : 'a234235', 'Type' : 'event1', 'Timestamp' : 1366006599 }
{ 'Data' : 'b978543', 'Type' : 'event2', 'Timestamp' : 1366006600 }
{ 'Data' : 'c567921', 'Type' : 'event3', 'Timestamp' : 1366006601 }
{ 'Data' : 'd327863', 'Type' : 'event1', 'Timestamp' : 1366007100 }
{ 'Data' : 'e012315', 'Type' : 'event2', 'Timestamp' : 1366007102 }
{ 'Data' : 'f834721', 'Type' : 'event3', 'Timestamp' : 1366007103 }

请帮助编写正确的查询以获取数据库中每个事件的当前状态。我需要三个不同类型的元素和最大时间戳。

4

3 回答 3

0

您可以使用以下 JavaScript 来完成您的工作。这里的缺点是我假设您的事件是恒定的,否则您需要在“类型”数组字段中更改它。

您可以在连接到数据库时调用它。

a=function()
{
    var Type = new Array();
    Type[0]="event1";
    Type[1]="event2";
    Type[2]="event3";
    Type[3]="event4";
    Type[4]="event5";

    for (i=0;i<Type.length;i++)
    {

        var myCursor = db.foo.find({Type:Type[i]}).sort({Timestamp:-1}).limit(1);
        myCursor.forEach(printjson);
    }
}

这是我为我的测试用例得到的输出。

MongoDB shell version: 2.2.2
connecting to: test

{
    "_id" : ObjectId("516bc991cde2925693705103"),
    "Data" : "d327863",
    "Type" : "event1",
    "Timestamp" : 1366007100
}
{
    "_id" : ObjectId("516bc991cde2925693705104"),
    "Data" : "e012315",
    "Type" : "event2",
    "Timestamp" : 1366007102
}
{
    "_id" : ObjectId("516bc992cde2925693705105"),
    "Data" : "f834721",
    "Type" : "event3",
    "Timestamp" : 1366007103
}
bye

另请注意,默认情况下它连接到测试数据库。类型和时间戳的索引将帮助您提高性能。

于 2013-04-16T05:40:25.470 回答
0

由于您可能有大约 200 个事件(如您对问题的评论中所述),我建议最有效的方法是创建一个记录最新事件(按类型)的摘要文档。$set这避免了进行单独查询的需要,并且在观察到新的事件类型时应该易于维护。

摘要文档如下所示:

{
    'Event1' : { 'Data' : 'd327863', 'Timestamp' : 1366007100 },
    'Event2' : { 'Data' : 'e012315', 'Timestamp' : 1366007102 },
    'Event3' : { 'Data' : 'f834721', 'Timestamp' : 1366007103 }
}

如果您经常需要按类型查找最大事件,这种预聚合报告模式将避免多次查询,并为索引节省(可能很大)空间,Timestamp否则需要在该索引上有效地查找最新条目。

于 2013-04-15T14:05:00.950 回答
0

您需要为每个事件单独查询。

db.yourCollection.find({Type:"event1"}).sort({Timestamp:-1}).limit(1);    
db.yourCollection.find({Type:"event2"}).sort({Timestamp:-1}).limit(1);    
db.yourCollection.find({Type:"event3"}).sort({Timestamp:-1}).limit(1);

请注意,在 Timestamp 字段上创建索引可能会大大提高性能。

另见:http ://docs.MongoDB.org/manual/reference/method/cursor.sort/

于 2013-04-15T09:35:45.653 回答