2016-03-02 57 views
0

我有数据DB这样的事情如何找到mongodb中的前5个值?不应该包含相同的值

[ 
     { Appname:ktr, softcount:10 ,timeStamp:1 }, 
     { Appname:rsr, soscount:8,timeStamp:2 }, 
     { Appname:ktr, softcount:9 ,timeStamp:3}, 
     { Appname:ssl, softcount:6,timeStamp:4}, 
     { Appname:ktr, softcount:7,timeStamp:5 }, 
     { Appname:ppr, softcount:5,timeStamp:6}, 
     { Appname:crs, softcount:4,timeStamp:7 }, 
     ............ 

    ] 

这里Appname键将包含未知值的值。 Appname可能是任何东西。

我需要根据TIMERANGE找到前5 softcount纪录,太不应该包含相同的Appname

要找到顶级的5个值,我已经使用这个查询

db.collection.find({timeStamp : { $gte : startTime, $lte :endTime}}).sort({'softcount':-1}).count(5) 

这里开始时间是1和endTime是7

它是给予前5 softcount记录但记录包含相同Appname。所以

我想要的结果是这样的,从数据库

[ 
    {Appname:ktr,softcount:10,timeStamp:1}, 
    {Appname:rsr,softcount:8,timeStamp:2}, 
    {Appname:ssl,softcount:6,timeStamp:4}, 
    {Appname:ppr,softcount:5,timeStamp:6}, 
    {Appname:crs,softcount:4,timeStamp:7} 
] 

这个结果Appnames不一样它不包含相同的Appname

可以写mongodb查询吗?

什么是查询以上记录?

回答

0

你可以使用聚合$first

link here

谁是懒得看它:

此数据收集sales

{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:00:00Z") } 
{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-02-03T09:00:00Z") } 
{ "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 5, "date" : ISODate("2014-02-03T09:05:00Z") } 
{ "_id" : 4, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-02-15T08:00:00Z") } 
{ "_id" : 5, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-02-15T09:05:00Z") } 
{ "_id" : 6, "item" : "xyz", "price" : 5, "quantity" : 5, "date" : ISODate("2014-02-15T12:05:10Z") } 
{ "_id" : 7, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-02-15T14:12:12Z") } 

可以汇总如下

db.sales.aggregate(
    [ 
    { $sort: { item: 1, date: 1 } }, 
    { 
     $group: 
     { 
      _id: "$item", 
      firstSalesDate: { $first: "$date" } 
     } 
    } 
    ] 
) 

给我们这个结果

{ "_id" : "xyz", "firstSalesDate" : ISODate("2014-02-03T09:05:00Z") } 
{ "_id" : "jkl", "firstSalesDate" : ISODate("2014-02-03T09:00:00Z") } 
{ "_id" : "abc", "firstSalesDate" : ISODate("2014-01-01T08:00:00Z") } 
+1

了解更多关于MongoDB的聚合框架,您忘了最后一个流水线阶段'{“$极限”:5}' – chridam

+0

我没有,我发现他的“如何做组与第一“,而不是具体的解决方案,他可以管道,他可以设置限制等。 – libik

1

那么,你可以使用聚合管道小组和项目数据格式,您希望看到的。

db.col.aggregate([ 
{$group:{_id:"$Appname", softcount:{$max:"$softcount"}}}, 
{$project:{_id:0, "Appname":"$_id", softcount:1}}, 
{$sort:{softcount:-1}}, 
{$limit: 5} 
]) 

这将打印以下结果,只要输入是您在问题中提到的内容。

{ 
    "softcount" : 10.0, 
    "Appname" : "ktr" 
} 
{ 
    "softcount" : 8.0, 
    "Appname" : "rsr" 
} 
{ 
    "softcount" : 6.0, 
    "Appname" : "ssl" 
} 
{ 
    "softcount" : 5.0, 
    "Appname" : "ppr" 
} 
{ 
    "softcount" : 4.0, 
    "Appname" : "crs" 
} 

您可以在https://docs.mongodb.org/manual/aggregation/

+0

谢谢你有用。我需要在聚合之前找到基于某个时间范围的数据,所以如果我使用find({timeStamp:{$ gte:startTime,$ lte:endTime}})menthod它给出了数据,但是我不能在这之后做聚合在聚合中使用find()方法? – silvesterprabu

+0

请用包含时间戳的实际样本数据更新您的问题。没有查看数据就很难说出任何内容。但是,在汇总框架中,您可以使用$ match运算符来限制数据。它的工作就像关系世界中的HAVING子句。 – Saleem

+0

$ match:{timeStamp:{$ gte:startTime,$ lte:endTime}}我想这会帮助..确认我问你... – silvesterprabu

相关问题