2016-11-14 14 views
0

次のシェルクエリのように減算演算子を使用していますが、Javaで減算を行う方法を見つけることができません。MongoDB Aggregate Subtract Java Driver 3.3

db.deviceDetail.aggregate([ 
    {$match: {'accountId':23, 'status':'Stopped'}}, 
    {'$project': { 
      'durationDiff': {'$subtract': [1479093620000, '$durationDate']}, 
      'stopStartDiff': {'$subtract': [1479093620000, '$stopStart']}, 
      'stopStart': 1, 
      'durationDate': 1, 
      '_id':0 
     } 
    }, 
    {'$match': {$or:[{'durationDiff': {'$gt': 0}}, {'stopStartDiff': {'$gt': 0}}]}} 
]) 

Java APIは減算演算子をサポートしていないようですが、下のdurationDiffとstopStartDiffの計算をどのように定義する必要がありますか?

AggregateIterable<Document> rslt = coll.aggregate(Arrays.asList(
       match(and(eq("assetName", "accountId"), eq("assetName", "accountId"))), 
       project(fields(
         excludeId(), 
         include(
          "durationDiff", ..., 
          "stopStartDiff", ..., 
          "stopStart", 
          "durationDate" 
         ) 
       )), 
       match(or(gt("durationDiff", 0), gt("stopStartDiff", 0))) 
     )); 

サンプル文書:

{ 
    "_id" : ObjectId("563064a4e4b0ea032ae14f77"), 
    "accountId" : NumberLong(23), 
    "stopStart" : NumberLong("1460133175000"), 
    "status" : "Stopped", 
    "durationDate" : NumberLong("1460133175000") 
} 
+0

サンプル文書を提供できますかコードをテストする? – notionquest

答えて

2

あなたがきたシンプルなユースケースのためのような何かを試すことができます。他の変数についても同じことをする必要があります。これにより、durationDiffが計算されます。 3.xのバージョンの2.xのバージョン

BasicDBList values = new BasicDBList(); 
values.add(1479093620000L); 
values.add("$durationDate"); 

AggregateIterable<Document> rslt = dbCollection.aggregate(Arrays.asList(
      project(fields(
        excludeId(), 
        include(
          "durationDiff", 
          "durationDate" 
        ), 
        new BasicDBObject("durationDiff", new BasicDBObject("$subtract", values)) 
        ) 
      ) 
    )); 

については

BsonDocumentを使用して

- タイプセーフ版

BsonArray operands = new BsonArray(); 
operands.add(new BsonInt64(1479093620000L)); 
operands.add(new BsonString("$durationDate")); 

BsonDocument subtract = new BsonDocument("$subtract", operands); 


AggregateIterable<BsonDocument> rslt = dbCollection.aggregate(Arrays.asList(
     project(fields(
       excludeId(), 
       include(
         "durationDiff", 
         "durationDate" 
       ), 
       new BsonDocument("durationDiff", subtract) 
       ) 
     ) 
)); 

のドキュメントを使用する - 非タイプセーフバージョン

AggregateIterable<Document> rslt = dbCollection.aggregate(Arrays.asList(
     project(fields(
       excludeId(), 
       include(
         "durationDiff", 
         "durationDate" 
       ), 
       new Document("durationDiff", new Document("$subtract", Arrays.asList(1479093620000L, "$durationDate"))) 
       ) 
     ) 
)); 
+0

ありがとうございました。 – user1636612

+0

あなたは3.xドライバを使用していました。ドライバ3.xの亜種を含むように更新されました。 – Veeram

関連する問題