1

MongoDBの新機能で、JavaでmongoJavaDriver.jarを使用しています。選択した日付範囲のfeildによるMongo DB + javaグループ化文書

私のコレクションにはさらに多くの書類がありますが、その一部をサンプルしています。

{ 
    "_id" : ObjectId("57ee4767d782023f80bd4f97"), 
    "USER_NAME" : "[email protected]", 
    "LOGIN" : ISODate("2016-09-29T18:30:00Z"), 
    "LOGOUT" : ISODate("2016-09-30T11:07:19.598Z"), 
    "LONGITUDE" : "long", 
    "LATITUDE" : "lat", 
    "SOURCE" : "Web", 
    "LAST_UPDATED" : ISODate("2016-09-30T11:07:19.598Z") 
} 
{ 
    "_id" : ObjectId("57ee4767d782023f80bd4f98"), 
    "USER_NAME" : "[email protected]", 
    "LOGIN" : ISODate("2016-09-29T18:30:00Z"), 
    "LOGOUT" : ISODate("2016-09-30T11:07:19.601Z"), 
    "LONGITUDE" : "long", 
    "LATITUDE" : "lat", 
    "SOURCE" : "Web", 
    "LAST_UPDATED" : ISODate("2016-09-30T11:07:19.601Z") 
} 
{ 
    "_id" : ObjectId("57ee4767d782023f80bd4f99"), 
    "USER_NAME" : "[email protected]", 
    "LOGIN" : ISODate("2016-09-29T18:30:00Z"), 
    "LOGOUT" : ISODate("2016-09-30T11:07:19.603Z"), 
    "LONGITUDE" : "long", 
    "LATITUDE" : "lat", 
    "SOURCE" : "Web", 
    "LAST_UPDATED" : ISODate("2016-09-30T11:07:19.603Z") 
} 
{ 
    "_id" : ObjectId("57ee4767d782023f80bd4f9e"), 
    "USER_NAME" : "[email protected]", 
    "LOGIN" : ISODate("2016-09-29T18:30:00Z"), 
    "LOGOUT" : ISODate("2016-09-30T11:07:19.608Z"), 
    "LONGITUDE" : "long", 
    "LATITUDE" : "lat", 
    "SOURCE" : "Web", 
    "LAST_UPDATED" : ISODate("2016-09-30T11:07:19.608Z") 
} 
{ 
    "_id" : ObjectId("57ee4767d782023f80bd4f9f"), 
    "USER_NAME" : "[email protected]", 
    "LOGIN" : ISODate("2016-09-29T18:30:00Z"), 
    "LOGOUT" : ISODate("2016-09-30T11:07:19.609Z"), 
    "LONGITUDE" : "long", 
    "LATITUDE" : "lat", 
    "SOURCE" : "Web", 
    "LAST_UPDATED" : ISODate("2016-09-30T11:07:19.609Z") 
} 

クエリを実行して、選択した日付範囲のドキュメントを検索でき、値を返します。

マイコード:

Date current = new Date(); 
    Date current2 = new Date(current .getYear(), current.getMonth(), current.getDate()-days); 
    current2.setHours(0); 
    current2.setMinutes(0); 
    BasicDBObject dateRange = new BasicDBObject ("$gte",current2); 
    dateRange.put("$lt", new Date(current.getYear(), current.getMonth(), current.getDate()+1)); 
    BasicDBObject query = new BasicDBObject("LAST_UPDATED", dateRange); 
    System.out.println(collection.find().count()); 
    System.out.println(collection.find(query).count()); 

総文書は、このコレクションでカウントが選択された日付に基づいて155

Countはこれらの選択された37枚の文書には37

されている、冗長な値がありますユーザー名でUSER_NAMEフィールドに基づいてグループ化したいと思います。このカウントは37未満になるでしょう。私はそれをどのようにすることができますか?

答えて

1

集約フレームワークを使用して、必要な集計を実行することができます。 Mongoの中の次のアグリゲーションフレームワークパイプラインは、基本的に供給された日付範囲クエリに基づいて、処理のためにパイプラインに入る文書を制限する$matchフィルタを使用 シェル実行検討、次いで$groupを用い グループUSER_NAMEフィールドによって文書と$sumを使用して異なる値をカウント:Javaへの上記の変換

var now = new Date(), 
    days = 4, 
    start = new Date(now.getYear(), now.getMonth(), now.getDate()-days), 
    end = new Date(now.getYear(), now.getMonth(), now.getDate()+1); 
end.setHours(0); 
end.setMinutes(0); 
var pipeline = [ 
    { "$match": { "LAST_UPDATED": { "$gte": start, "$lte": end } } }, 
    { 
     "$group": { 
      "_id": "$USER_NAME", 
      "count": { "$sum": 1 } 
     } 
    } 
]; 
db.collection.aggregate(pipeline); 

は次のようになります。

public class JavaAggregation { 
    public static void main(String args[]) throws UnknownHostException { 

     MongoClient mongo = new MongoClient(); 
     DB db = mongo.getDB("test"); // your database name 

     DBCollection coll = db.getCollection("collectionName"); // your collection name 

     // create the pipeline operations, first with the $match 
     Date now = new Date(); 
     Date start = new Date(now.getYear(), now.getMonth(), now.getDate()-days); 
     Date end = new Date(now.getYear(), now.getMonth(), now.getDate()+1); 
     end.setHours(0); 
     end.setMinutes(0); 
     DBObject match = new BasicDBObject("$match", 
          new BasicDBObject("LAST_UPDATED", 
           new BasicDBObject("$gte", start).append("$lt", end) 
          ) 
         ); 

     // build the $group operations 
     DBObject groupFields = new BasicDBObject("_id", "$USER_NAME"); 
     groupFields.put("count", new BasicDBObject("$sum", 1)); 

     DBObject group = new BasicDBObject("$group", groupFields); 
     List<DBObject> pipeline = Arrays.asList(match, group); 

     AggregationOutput output = coll.aggregate(pipeline); 

     for (DBObject result : output.results()) { 
      System.out.println(result); 
     } 
    } 
} 
+1

ありがとうございます、期待通りに動作します。 –

関連する問題