私はこれを行う方法を考え出したと思います。 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のように見える。) `日付等
何か:{$のarrayElemAt:[、]}' –
Veeram