2017-04-21 1 views
2

私のコレクションにDateTimeOffsetフィールドを格納するためにC#ドライバを使用しています。 一定の期間、つまり値をグループ化する必要があります。日ごとに。問題がDateTimeOffsetarray[2]として格納されているということですので、私は日付を取得するには、このフィールドを使用することはできませんし、それをフォーマットするMongodb project数値からの日付(DateTimeOffset)

db.getCollection('Collection').aggregate([ 
    { 
     $project: 
     { 
     yearMonthDay: { $dateToString: { format: "%Y-%m-%d", date: { <here should go my DateTimeOffsetField> } } } 
     } 
    }, 
    {$group: {_id: '$yearMonthDay', count: {$sum:1}}} 
]) 

:ので、私のようなものをやってる行うに

これを行う方法はありますか?

+0

何か:{$のarrayElemAt:[]}' – Veeram

答えて

0

私はこれを行う方法を考え出したと思います。 DateTimeOffsetは、UTCティックに追加される目盛り(UTC)と分数の2つの要素を持つ配列として格納されます。

このデータから日付を取得するために、UTCの日付時刻を保持する追加のフィールドを格納してから、このUTCの日付時刻にDateTimeOffsetの分を追加できると考えました。

だから私はこのようなものになってしまった:

db.getCollection('State').aggregate([ { 
     $project: { 
     yearMonthDay: { $dateToString: { 
      format: "%Y-%m-%d", 
      date: { $add: ["$StateDateUTC", {$multiply: [ {$arrayElemAt: ["$StateDateLocal",1]}, 60*1000]} ]} 
      } }, 
     ticks: "$StateDurationTicks" } 
    }, 
    {$group: {_id: '$yearMonthDay', count: {$sum:1}, totalTime: {$sum: "$ticks"}}} 
]) 

StateDateUTCだけUTC日時を格納し、この追加のフィールドです。

StateDateLocalは、上記のようにarray[2]として表されるフィールドである。DateTimeOffsetである。

StateDurationTicksは、合計したい追加期間のフィールドです。

60*1000は、Dateとmongoにミリ秒を追加するため、分をミリ秒に変換します。

私はMongoのC#のドライバーに直接このコードを使用する場合残念ながら、JSONの書式に関するエラーがありますので、我々はこのようになりますBsonDocument形でこのJSONを書き換える必要がある(多分バグ?):

var aggr = collection.Aggregate(); 
// [...] bunch of Match() 
ProjectionDefinition<State> projection = 
    new BsonDocument { 
     { "yearMonthDay", new BsonDocument { 
      { "$dateToString", new BsonDocument { 
       { "format", dateFormat }, 
       { "date", new BsonDocument { 
        { "$add", new BsonArray { 
         { "$StateDateUTC" }, 
         new BsonDocument { { "$multiply", new BsonArray { 
          { 60*1000 }, 
          new BsonDocument { { 
           "$arrayElemAt", new BsonArray{ 
            { "$StateDateLocal" }, 
            { 1 } 
           } 
          } } 
         } } } // multiply 
        } } // add 
       } } // date 
      } } // dateToString 
     } }, // yearMonthDay 
     { "ticks", "$StateDurationTicks" } 
    }; 

var projected = aggr.Project<BsonDocument>(projection); 

var groupped = projected.Group(new BsonDocument { { "_id", "$yearMonthDay" }, 
          { "Count", new BsonDocument("$sum", 1) }, 
          { "Duration", new BsonDocument("$sum", "$ticks") } }); 
var bsonList = await groupped.ToListAsync(); 

私はそれが動作すると思います。

それ以上のC#よりLispのように見える。) `日付等

関連する問題