2016-04-11 10 views
0

こんにちは私はLINQを使用して配列内のドキュメントを数えようとしています。埋め込みドキュメントをカウントするmongodb c#LINQ

私の構造は単純です。ここに簡略化されたBsonサンプルがあります。

{ 
"_id" : ObjectId("56fa945dbf0c37096048109f"), 
"Commands" : [ 
    { 

     "CommandId" : ObjectId("56fbdc24bf0c372078f10227"), 
    }, 
    { 
     "CommandId" : ObjectId("56fbdc28bf0c372078f1022b"),  
    }, 
    { 
     "CommandId" : ObjectId("570b6863bf0c370838473321"), 
    } 
] 

}

これは私がこれまでに出ているものですが、それだけで私は1つのコマンドを持っていると言います。

var result = 
        (from e in collection.AsQueryable<Sequence>() 
        where e._id == seqid 
        select e.Commands).Count();    
       Console.WriteLine("There where " + result + " Commands"); 

+0

私はMongoDBを使っていましたが、Commandオブジェクトの数を数えているようです。この場合は実際には1項目だけです。 Commandsオブジェクトの内容を列挙する必要があります。 – Alex

答えて

1

私は、このための集約フレームワークと$のサイズを使用することをお勧めします - クライアントへの配列自体を転送しないようになること。あなたがここに$サイズの詳細を読むことができ

var result = collection.Aggregate().Match(x => x.Id == seqid) 
    .Project(new BsonDocument("count", new BsonDocument("$size", "$Commands"))) 
    .FirstOrDefault() 
    .GetValue("count").ToInt32(); 

Console.WriteLine("There were " + result + " Commands"); 

https://docs.mongodb.org/manual/reference/operator/aggregation/size/

+0

私はそのことについて知らなかった。よく見えて、ケビンに感謝します! – Jacob

0

私は解決策を見出すことができましたが、それが最善であるかどうかはわかりませんが、うまくいきます。

  var result = (from p in collection.AsQueryable().Where(p => p._id == seqid) 
       from cmds in p.Commands 
       select cmds).Count(); 
      Console.WriteLine("There where " + result + " Commands"); 
0

LINQクエリは常に集約フレームワークパイプラインへと

> var pipeline = [ 
... { "$group" : { "_id" : 1, "__result" : { "$sum" : 1 } } } 
... ] 
> db.test.aggregate(pipeline) 

使用簡単なカウント方法を翻訳している。例えば

フィルタリング

関連する問題