2016-03-19 12 views
0

私は毎日私の時間を集計しようとしていますが、何か問題があります。MongoDB集約groupby idは常にnullです。

私のクラスがある:、

var args = new AggregateArgs(); 

var pipeline = new[] 
{ 
    new BsonDocument("$match", 
     Query<AppHourSerieEntity>.EQ(c => c.UserId, user).ToBsonDocument()), 
    new BsonDocument("$match", 
     Query<AppHourSerieEntity>.EQ(c => c.Type, metric).ToBsonDocument()), 
    new BsonDocument("$match", 
     Query<AppHourSerieEntity>.GTE(c => c.Hour, from).ToBsonDocument()), 
    new BsonDocument("$match", 
     Query<AppHourSerieEntity>.LTE(c => c.Hour, to).ToBsonDocument()), 
    new BsonDocument 
    { 
     { 
      "$project", 
      new BsonDocument 
      { 
       {"key", "$dateToString: { format: '%Y-%m-%d', date: '$Hour' }"}, 
       {"value", "$Value"} 

      } 
     } 
    }, 

    new BsonDocument 
    { 
     { 
      "$group", new BsonDocument 
      { 
       {"key", "$key"}, 
       {"Value", new BsonDocument {{"$sum", "$value"}}}, 
       {"Count", new BsonDocument {{"$sum", (double) 1}}} 
      } 
     } 
    } 
}; 

args.Pipeline = pipeline; 
args.AllowDiskUse = true; 

var aggregate = _repo.GetCollection().Aggregate(args); 

このコードを使用している間、 "バリュー" のように見え、 "カウント" はOKですが、 "_id" は常にnullです:私の集計方法がある

public class Serie { 
    [BsonId] 
    public ObjectId Id { get; set; } 

    [BsonDateTimeOptions(Kind = DateTimeKind.Utc)] 
    public DateTime Hour { get; set; } 

    public ObjectId UserId { get; set; } 
    public ObjectId AppId { get; set; } 

    public AppHourSerieMetric Type { get; set; } 

    public double Value { get; set; } 
} 

。私は理由を知ることはできませんが、 "価値"の価値は私が期待したとおりであるため "プロジェクト"が機能します。

var pipeline = new[] 
{ 
    new BsonDocument("$match", 
     Query<AppHourSerieEntity>.EQ(c => c.UserId, user).ToBsonDocument()), 
    new BsonDocument("$match", 
     Query<AppHourSerieEntity>.EQ(c => c.Type, metric).ToBsonDocument()), 
    new BsonDocument("$match", 
     Query<AppHourSerieEntity>.GTE(c => c.Hour, from).ToBsonDocument()), 
    new BsonDocument("$match", 
     Query<AppHourSerieEntity>.LTE(c => c.Hour, to).ToBsonDocument()),     
    new BsonDocument 
    { 
     { 
      "$group", new BsonDocument 
      { 
       {"_id", "{ month: { $month: '$Hour' }, day: { $dayOfMonth: '$Hour' }, year: { $year: '$Hour' } }"}, 
       {"Value", new BsonDocument {{"$sum", "$Value"}}}, 
       {"Count", new BsonDocument {{"$sum", (double) 1}}} 
      } 
     } 
    } 
}; 

が、私はそれを書いたとされる「_id」のために返された結果:

{ 
    "_id":"{ month: { $month: '$Hour' }, day: { $dayOfMonth: '$Hour' }, year: { $year: '$Hour' } }", 
    "Value":16210.0, 
    "Count":3.0 
} 

だから、両方のコードのように「価値」と「カウントに見える

は、私はまた、このコードを試してみました"はOKですが、" _id "は間違っています。 ヒント?

+0

さてあなたはそう、あなたがエラーを取得します '' $ group'と_id'を必要としています。しかし、あなたが提供したもの(どちらの場合も実際に)は "文字列"であり、 "BsonDocument"ではありません。代わりに 'BsonDocument'を使用してください。 –

+0

@BlakesSevenあなたが提案した例を書くことができますか? –

答えて

1

使用$groupのためのあなたの_idBsonDocumentない文字列は:

 new BsonDocument 
     { 
      { 
       "$group", new BsonDocument 
       { 
        { 
         "_id", 
         new BsonDocument 
          { 
          { "month", new BsonDocument("$month", "$Hour") }, 
          { "day", new BsonDocument("$dayOfMonth", "$Hour") }, 
          { "year", new BsonDocument("$year", "$Hour") } 
          } 
        }, 
        {"Value", new BsonDocument {{"$sum", "$Value"}}}, 
        {"Count", new BsonDocument {{"$sum", (double) 1}}} 
       } 
      } 
     } 
+0

正常に動作します。多分、私が "プロジェクト"を使用する最初の例のアイデアもありますか? –

+0

@NovkovskiStevoBatoいいえ、私はあなたがそれを行う方法ですから "アイデアを"持っています。集約フレームワークがフィールドまたは他の有効なBSON式に解決できないものは、グループ化 '_id'で' null'として扱われ、効果的に「すべて」を単一の文書結果にグループ化します。したがってJSON表現では "strings"ではなくBSONを使用します。また、 '$ group'の前に' $ project'を使うことは、実際にはすべてのデータを渡して式を計算するため、賢明です。ですから、代わりに式を '_id'に直接置きます。 –

関連する問題